From c324c71fe919437470ee2583672806f175ba370c Mon Sep 17 00:00:00 2001 From: "dannyxu@yeah.net" Date: Sun, 27 Sep 2026 18:52:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 + FileProcessClient.csproj | 32 + FileProcessClient.csproj.user | 11 + FileProcessClient.sln | 25 + LoginForm.Designer.cs | 203 +++++ LoginForm.cs | 86 +++ LoginForm.resx | 126 ++++ MainForm.Designer.cs | 1147 +++++++++++++++++++++++++++++ MainForm.cs | 486 ++++++++++++ MainForm.resx | 156 ++++ Program.cs | 23 + Properties/Resources.Designer.cs | 253 +++++++ Properties/Resources.resx | 178 +++++ Resources/Account.png | Bin 0 -> 7132 bytes Resources/Config-local.ini | 20 + Resources/Config.ini | 20 + Resources/Icon1.ico | Bin 0 -> 45451 bytes Resources/add-files.png | Bin 0 -> 1480 bytes Resources/avatar.png | Bin 0 -> 812 bytes Resources/file-loading.gif | Bin 0 -> 67289 bytes Resources/file-upload.png | Bin 0 -> 1074 bytes Resources/folder-add.png | Bin 0 -> 515 bytes Resources/open-folder.png | Bin 0 -> 671 bytes Resources/open-folder1.png | Bin 0 -> 1338 bytes Resources/save-icon.png | Bin 0 -> 456 bytes Resources/save.png | Bin 0 -> 787 bytes Resources/select-file.png | Bin 0 -> 790 bytes Resources/sys-config.png | Bin 0 -> 1145 bytes Resources/sys-config1.png | Bin 0 -> 877 bytes Resources/sys-logo.png | Bin 0 -> 21798 bytes Resources/upload-file.png | Bin 0 -> 1401 bytes Resources/upload-to-server-01.png | Bin 0 -> 3609 bytes Resources/upload-to-server.png | Bin 0 -> 1134 bytes Resources/video-icon.png | Bin 0 -> 952 bytes domain/ComboboxItem.cs | 19 + domain/DeviceInfo.cs | 17 + domain/MediaFileInfo.cs | 44 ++ domain/MediaFileItem.cs | 25 + domain/User.cs | 28 + utils/CommonUtils.cs | 218 ++++++ utils/FileUploadUtils.cs | 163 ++++ utils/HttpUtils.cs | 247 +++++++ 42 files changed, 3534 insertions(+) create mode 100644 .gitignore create mode 100644 FileProcessClient.csproj create mode 100644 FileProcessClient.csproj.user create mode 100644 FileProcessClient.sln create mode 100644 LoginForm.Designer.cs create mode 100644 LoginForm.cs create mode 100644 LoginForm.resx create mode 100644 MainForm.Designer.cs create mode 100644 MainForm.cs create mode 100644 MainForm.resx create mode 100644 Program.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Resources/Account.png create mode 100644 Resources/Config-local.ini create mode 100644 Resources/Config.ini create mode 100644 Resources/Icon1.ico create mode 100644 Resources/add-files.png create mode 100644 Resources/avatar.png create mode 100644 Resources/file-loading.gif create mode 100644 Resources/file-upload.png create mode 100644 Resources/folder-add.png create mode 100644 Resources/open-folder.png create mode 100644 Resources/open-folder1.png create mode 100644 Resources/save-icon.png create mode 100644 Resources/save.png create mode 100644 Resources/select-file.png create mode 100644 Resources/sys-config.png create mode 100644 Resources/sys-config1.png create mode 100644 Resources/sys-logo.png create mode 100644 Resources/upload-file.png create mode 100644 Resources/upload-to-server-01.png create mode 100644 Resources/upload-to-server.png create mode 100644 Resources/video-icon.png create mode 100644 domain/ComboboxItem.cs create mode 100644 domain/DeviceInfo.cs create mode 100644 domain/MediaFileInfo.cs create mode 100644 domain/MediaFileItem.cs create mode 100644 domain/User.cs create mode 100644 utils/CommonUtils.cs create mode 100644 utils/FileUploadUtils.cs create mode 100644 utils/HttpUtils.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81ab08a --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +################################################################################ +# 此 .gitignore 文件已由 Microsoft(R) Visual Studio 自动创建。 +################################################################################ + +/.vs +/bin +/obj diff --git a/FileProcessClient.csproj b/FileProcessClient.csproj new file mode 100644 index 0000000..e36e87a --- /dev/null +++ b/FileProcessClient.csproj @@ -0,0 +1,32 @@ + + + + WinExe + net8.0-windows8.0 + enable + true + enable + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file diff --git a/FileProcessClient.csproj.user b/FileProcessClient.csproj.user new file mode 100644 index 0000000..7042c14 --- /dev/null +++ b/FileProcessClient.csproj.user @@ -0,0 +1,11 @@ + + + + + Form + + + Form + + + \ No newline at end of file diff --git a/FileProcessClient.sln b/FileProcessClient.sln new file mode 100644 index 0000000..c77bde7 --- /dev/null +++ b/FileProcessClient.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34511.84 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FileProcessClient", "FileProcessClient.csproj", "{C46CAAB7-521D-4487-951B-481E1CD3256B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C46CAAB7-521D-4487-951B-481E1CD3256B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C46CAAB7-521D-4487-951B-481E1CD3256B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C46CAAB7-521D-4487-951B-481E1CD3256B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C46CAAB7-521D-4487-951B-481E1CD3256B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {04556C10-FFC6-41C6-B86C-5CDBA0E61A6D} + EndGlobalSection +EndGlobal diff --git a/LoginForm.Designer.cs b/LoginForm.Designer.cs new file mode 100644 index 0000000..65b2d90 --- /dev/null +++ b/LoginForm.Designer.cs @@ -0,0 +1,203 @@ +namespace FileProcessClient +{ + partial class LoginForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + hopeForm1 = new ReaLTaiizor.Forms.HopeForm(); + hopePictureBox1 = new ReaLTaiizor.Controls.HopePictureBox(); + labelEdit1 = new ReaLTaiizor.Controls.LabelEdit(); + btnLogin = new ReaLTaiizor.Controls.HopeButton(); + chkSavePassword = new ReaLTaiizor.Controls.ForeverCheckBox(); + txtName = new ReaLTaiizor.Controls.HopeTextBox(); + txtPassword = new ReaLTaiizor.Controls.HopeTextBox(); + ((System.ComponentModel.ISupportInitialize)hopePictureBox1).BeginInit(); + SuspendLayout(); + // + // txtName + // + txtName.BackColor = Color.FromArgb(5, 15, 25); + txtName.BaseColor = Color.FromArgb(44, 55, 66); + txtName.BorderColorA = Color.FromArgb(192, 64, 0); + txtName.BorderColorB = Color.FromArgb(230, 162, 60); + txtName.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + txtName.ForeColor = Color.FromArgb(224, 224, 224); + txtName.Hint = "请输入账号"; + txtName.Location = new Point(34, 260); + txtName.MaxLength = 32767; + txtName.Multiline = false; + txtName.Name = "txtName"; + txtName.PasswordChar = '\0'; + txtName.ScrollBars = ScrollBars.None; + txtName.SelectedText = ""; + txtName.SelectionLength = 0; + txtName.SelectionStart = 0; + txtName.Size = new Size(300, 38); + txtName.TabIndex = 2; + txtName.TabStop = false; + txtName.UseSystemPasswordChar = false; + // + // txtPassword + // + txtPassword.BackColor = Color.FromArgb(5, 15, 25); + txtPassword.BaseColor = Color.FromArgb(44, 55, 66); + txtPassword.BorderColorA = Color.FromArgb(192, 64, 0); + txtPassword.BorderColorB = Color.FromArgb(230, 162, 60); + txtPassword.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + txtPassword.ForeColor = Color.FromArgb(224, 224, 224); + txtPassword.Hint = "请输入密码"; + txtPassword.Location = new Point(34, 329); + txtPassword.MaxLength = 32767; + txtPassword.Multiline = false; + txtPassword.Name = "txtPassword"; + txtPassword.PasswordChar = '*'; + txtPassword.ScrollBars = ScrollBars.None; + txtPassword.SelectedText = ""; + txtPassword.SelectionLength = 0; + txtPassword.SelectionStart = 0; + txtPassword.Size = new Size(300, 38); + txtPassword.TabIndex = 3; + txtPassword.TabStop = false; + txtPassword.UseSystemPasswordChar = false; + // + // hopeForm1 + // + hopeForm1.ControlBoxColorH = Color.FromArgb(228, 231, 237); + hopeForm1.ControlBoxColorHC = Color.FromArgb(245, 108, 108); + hopeForm1.ControlBoxColorN = Color.White; + hopeForm1.Dock = DockStyle.Top; + hopeForm1.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + hopeForm1.ForeColor = Color.FromArgb(242, 246, 252); + hopeForm1.Image = Properties.Resources.Account; + hopeForm1.Location = new Point(0, 0); + hopeForm1.MaximizeBox = false; + hopeForm1.MinimizeBox = false; + hopeForm1.Name = "hopeForm1"; + hopeForm1.Size = new Size(407, 40); + hopeForm1.TabIndex = 0; + hopeForm1.Text = "系统登录"; + hopeForm1.ThemeColor = Color.FromArgb(92, 173, 255); + // + // hopePictureBox1 + // + hopePictureBox1.BackColor = Color.FromArgb(192, 196, 204); + hopePictureBox1.BackgroundImageLayout = ImageLayout.Center; + hopePictureBox1.Image = Properties.Resources.sys_logo; + hopePictureBox1.Location = new Point(134, 67); + hopePictureBox1.Name = "hopePictureBox1"; + hopePictureBox1.PixelOffsetType = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; + hopePictureBox1.Size = new Size(101, 99); + hopePictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; + hopePictureBox1.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + hopePictureBox1.TabIndex = 1; + hopePictureBox1.TabStop = false; + hopePictureBox1.TextRenderingType = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + // + // labelEdit1 + // + labelEdit1.AutoSize = true; + labelEdit1.BackColor = Color.Transparent; + labelEdit1.Font = new Font("微软雅黑", 12F, FontStyle.Bold, GraphicsUnit.Point, 134); + labelEdit1.ForeColor = Color.White; + labelEdit1.Location = new Point(34, 403); + labelEdit1.Name = "labelEdit1"; + labelEdit1.Size = new Size(74, 22); + labelEdit1.TabIndex = 3; + labelEdit1.Text = "记住密码"; + // + // btnLogin + // + btnLogin.BorderColor = Color.FromArgb(220, 223, 230); + btnLogin.ButtonType = ReaLTaiizor.Util.HopeButtonType.Primary; + btnLogin.Cursor = Cursors.Hand; + btnLogin.DangerColor = Color.FromArgb(245, 108, 108); + btnLogin.DefaultColor = Color.FromArgb(255, 255, 255); + btnLogin.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + btnLogin.HoverTextColor = Color.FromArgb(48, 49, 51); + btnLogin.InfoColor = Color.FromArgb(144, 147, 153); + btnLogin.Location = new Point(115, 519); + btnLogin.Name = "btnLogin"; + btnLogin.PrimaryColor = Color.FromArgb(64, 158, 255); + btnLogin.Size = new Size(147, 45); + btnLogin.SuccessColor = Color.FromArgb(103, 194, 58); + btnLogin.TabIndex = 5; + btnLogin.Text = "登录"; + btnLogin.TextColor = Color.White; + btnLogin.WarningColor = Color.FromArgb(230, 162, 60); + btnLogin.Click += btnLogin_Click; + // + // chkSavePassword + // + chkSavePassword.BackColor = Color.FromArgb(60, 70, 73); + chkSavePassword.BaseColor = Color.FromArgb(45, 47, 49); + chkSavePassword.BorderColor = Color.FromArgb(35, 168, 109); + chkSavePassword.Checked = true; + chkSavePassword.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + chkSavePassword.ForeColor = Color.FromArgb(243, 243, 243); + chkSavePassword.Location = new Point(136, 403); + chkSavePassword.Name = "chkSavePassword"; + chkSavePassword.Options = ReaLTaiizor.Controls.ForeverCheckBox._Options.Style1; + chkSavePassword.Size = new Size(20, 22); + chkSavePassword.TabIndex = 4; + // + // LoginForm + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(32, 42, 52); + ClientSize = new Size(407, 646); + Controls.Add(chkSavePassword); + Controls.Add(btnLogin); + Controls.Add(labelEdit1); + Controls.Add(txtPassword); + Controls.Add(txtName); + Controls.Add(hopePictureBox1); + Controls.Add(hopeForm1); + FormBorderStyle = FormBorderStyle.None; + MaximizeBox = false; + MaximumSize = new Size(2560, 1400); + MinimizeBox = false; + MinimumSize = new Size(190, 40); + Name = "LoginForm"; + StartPosition = FormStartPosition.CenterScreen; + Activated += LoginForm_Activated; + ((System.ComponentModel.ISupportInitialize)hopePictureBox1).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private ReaLTaiizor.Forms.HopeForm hopeForm1; + private ReaLTaiizor.Controls.HopePictureBox hopePictureBox1; + private ReaLTaiizor.Controls.LabelEdit labelEdit1; + private ReaLTaiizor.Controls.HopeButton btnLogin; + private ReaLTaiizor.Controls.ForeverCheckBox chkSavePassword; + private ReaLTaiizor.Controls.HopeTextBox txtName; + private ReaLTaiizor.Controls.HopeTextBox txtPassword; + } +} \ No newline at end of file diff --git a/LoginForm.cs b/LoginForm.cs new file mode 100644 index 0000000..1830b5a --- /dev/null +++ b/LoginForm.cs @@ -0,0 +1,86 @@ +using edu.huvtc.utils; +using System.Diagnostics; +using System.Xml.Linq; + +namespace FileProcessClient +{ + public partial class LoginForm : Form + { + public LoginForm() + { + InitializeComponent(); + } + + private async void btnLogin_Click(object sender, EventArgs e) + { + + string username = txtName.Text; + if (username.Length == 0) + { + MessageBox.Show("请输入账号!"); + return; + } + string password = txtPassword.Text; + if (password.Length == 0) + { + MessageBox.Show("请输入密码!"); + return; + } + + //Trace.WriteLine(password); + + Trace.WriteLine(username); + + bool flag = await HttpUtils.validateLogin(username, password); + if (!flag) + { + MessageBox.Show("用户名或密码错误,请重试"); + return; + } + + + if (chkSavePassword.Checked) + { + CommonUtils.writeToIni("userData", "userName", Convert.ToBase64String(CommonUtils.EncryptString(username))); + CommonUtils.writeToIni("userData", "password", Convert.ToBase64String(CommonUtils.EncryptString(password))); + } + + await HttpUtils.getUserInfo(); + + loadMainForm(); + } + private void loadMainForm() + { + mainForm mainForm = new mainForm(); + mainForm.Show(); + this.Hide(); + } + private async void LoginForm_Activated(object sender, EventArgs e) + { + + bool valid = await HttpUtils.getUserInfo(); + if (!valid) + { + string name = CommonUtils.readFromFile("userData", "username"); + //Trace.WriteLine(name); + if (name != null && name != "") + { + txtName.Text = CommonUtils.DecryptToString(Convert.FromBase64String(name)); + } + + string password = CommonUtils.readFromFile("userData", "password"); + //Trace.WriteLine(name); + if (password != null && password != "") + { + txtPassword.Text = CommonUtils.DecryptToString(Convert.FromBase64String(password)); + } + } + else + { + loadMainForm(); + } + + + } + } +} diff --git a/LoginForm.resx b/LoginForm.resx new file mode 100644 index 0000000..cf02749 --- /dev/null +++ b/LoginForm.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + False + + \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs new file mode 100644 index 0000000..e9c7418 --- /dev/null +++ b/MainForm.Designer.cs @@ -0,0 +1,1147 @@ +namespace FileProcessClient +{ + partial class mainForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(mainForm)); + DataGridViewCellStyle dataGridViewCellStyle1 = new DataGridViewCellStyle(); + DataGridViewCellStyle dataGridViewCellStyle2 = new DataGridViewCellStyle(); + DataGridViewCellStyle dataGridViewCellStyle3 = new DataGridViewCellStyle(); + hopeFormMain = new ReaLTaiizor.Forms.HopeForm(); + panelToolbar = new ReaLTaiizor.Controls.Panel(); + headerLabel1 = new ReaLTaiizor.Controls.HeaderLabel(); + lblUserName = new ReaLTaiizor.Controls.SkyLabel(); + btnSysConfig = new ReaLTaiizor.Controls.Button(); + btnOpenUpload = new ReaLTaiizor.Controls.Button(); + pnlUpload = new ReaLTaiizor.Controls.Panel(); + poisonPanel6 = new ReaLTaiizor.Controls.PoisonPanel(); + fileListGrid = new DataGridView(); + no = new DataGridViewTextBoxColumn(); + path = new DataGridViewTextBoxColumn(); + status = new DataGridViewTextBoxColumn(); + colOperator = new DataGridViewCheckBoxColumn(); + panel2 = new ReaLTaiizor.Controls.Panel(); + uploadbar = new ReaLTaiizor.Controls.CyberProgressBar(); + btnUpload = new ReaLTaiizor.Controls.PoisonButton(); + poisonPanel12 = new ReaLTaiizor.Controls.PoisonPanel(); + btnAddfiles = new ReaLTaiizor.Controls.PoisonButton(); + btnSelFile = new ReaLTaiizor.Controls.PoisonButton(); + btnAddDirectory = new ReaLTaiizor.Controls.PoisonButton(); + btnSelDirectory = new ReaLTaiizor.Controls.PoisonButton(); + poisonPanel4 = new ReaLTaiizor.Controls.PoisonPanel(); + txtDirectory = new ReaLTaiizor.Controls.MetroTextBox(); + metroLabel4 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel3 = new ReaLTaiizor.Controls.PoisonPanel(); + versionList = new ReaLTaiizor.Controls.HopeComboBox(); + metroLabel1 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel1 = new ReaLTaiizor.Controls.PoisonPanel(); + cameraList = new ReaLTaiizor.Controls.HopeComboBox(); + metroLabel2 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel2 = new ReaLTaiizor.Controls.PoisonPanel(); + metroLabel3 = new ReaLTaiizor.Controls.MetroLabel(); + tooltipUpload = new ReaLTaiizor.Controls.MetroToolTip(); + btn_save = new ReaLTaiizor.Controls.PoisonButton(); + pnlConfig = new ReaLTaiizor.Controls.Panel(); + panel1 = new ReaLTaiizor.Controls.Panel(); + poisonPanel11 = new ReaLTaiizor.Controls.PoisonPanel(); + txt_ftp_password = new ReaLTaiizor.Controls.PoisonTextBox(); + metroLabel6 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel10 = new ReaLTaiizor.Controls.PoisonPanel(); + txt_ftp_user = new ReaLTaiizor.Controls.PoisonTextBox(); + metroLabel10 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel9 = new ReaLTaiizor.Controls.PoisonPanel(); + txt_server_port = new ReaLTaiizor.Controls.PoisonTextBox(); + metroLabel9 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel8 = new ReaLTaiizor.Controls.PoisonPanel(); + txt_ftp_server = new ReaLTaiizor.Controls.PoisonTextBox(); + metroLabel8 = new ReaLTaiizor.Controls.MetroLabel(); + poisonPanel7 = new ReaLTaiizor.Controls.PoisonPanel(); + txt_server_url = new ReaLTaiizor.Controls.PoisonTextBox(); + metroLabel7 = new ReaLTaiizor.Controls.MetroLabel(); + metroLabel5 = new ReaLTaiizor.Controls.MetroLabel(); + panelToolbar.SuspendLayout(); + pnlUpload.SuspendLayout(); + poisonPanel6.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)fileListGrid).BeginInit(); + panel2.SuspendLayout(); + poisonPanel12.SuspendLayout(); + poisonPanel4.SuspendLayout(); + poisonPanel3.SuspendLayout(); + poisonPanel1.SuspendLayout(); + poisonPanel2.SuspendLayout(); + pnlConfig.SuspendLayout(); + panel1.SuspendLayout(); + poisonPanel11.SuspendLayout(); + poisonPanel10.SuspendLayout(); + poisonPanel9.SuspendLayout(); + poisonPanel8.SuspendLayout(); + poisonPanel7.SuspendLayout(); + SuspendLayout(); + // + // hopeFormMain + // + hopeFormMain.ControlBoxColorH = Color.FromArgb(228, 231, 237); + hopeFormMain.ControlBoxColorHC = Color.FromArgb(245, 108, 108); + hopeFormMain.ControlBoxColorN = Color.White; + hopeFormMain.Dock = DockStyle.Top; + hopeFormMain.Font = new Font("Segoe UI", 12F); + hopeFormMain.ForeColor = Color.FromArgb(242, 246, 252); + hopeFormMain.Image = (Image)resources.GetObject("hopeFormMain.Image"); + hopeFormMain.Location = new Point(0, 0); + hopeFormMain.Name = "hopeFormMain"; + hopeFormMain.Size = new Size(599, 40); + hopeFormMain.TabIndex = 0; + hopeFormMain.ThemeColor = Color.FromArgb(92, 173, 255); + // + // panelToolbar + // + panelToolbar.BackColor = Color.FromArgb(39, 51, 63); + panelToolbar.Controls.Add(headerLabel1); + panelToolbar.Controls.Add(lblUserName); + panelToolbar.Controls.Add(btnSysConfig); + panelToolbar.Controls.Add(btnOpenUpload); + panelToolbar.Dock = DockStyle.Top; + panelToolbar.EdgeColor = Color.FromArgb(32, 41, 50); + panelToolbar.Location = new Point(0, 40); + panelToolbar.Name = "panelToolbar"; + panelToolbar.Padding = new Padding(5); + panelToolbar.Size = new Size(599, 50); + panelToolbar.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + panelToolbar.TabIndex = 1; + // + // headerLabel1 + // + headerLabel1.BackColor = Color.Transparent; + headerLabel1.Dock = DockStyle.Right; + headerLabel1.Font = new Font("Microsoft Sans Serif", 11F, FontStyle.Bold); + headerLabel1.ForeColor = Color.FromArgb(255, 255, 255); + headerLabel1.Image = Properties.Resources.avatar1; + headerLabel1.Location = new Point(456, 5); + headerLabel1.Name = "headerLabel1"; + headerLabel1.Size = new Size(35, 40); + headerLabel1.TabIndex = 5; + // + // lblUserName + // + lblUserName.Dock = DockStyle.Right; + lblUserName.Font = new Font("微软雅黑", 14.25F, FontStyle.Bold, GraphicsUnit.Point, 0); + lblUserName.ForeColor = Color.FromArgb(255, 128, 128); + lblUserName.Location = new Point(491, 5); + lblUserName.Margin = new Padding(3, 10, 3, 0); + lblUserName.Name = "lblUserName"; + lblUserName.Size = new Size(103, 40); + lblUserName.TabIndex = 4; + lblUserName.Text = "用户名"; + lblUserName.TextAlign = ContentAlignment.MiddleCenter; + // + // btnSysConfig + // + btnSysConfig.BackColor = Color.Transparent; + btnSysConfig.BorderColor = Color.FromArgb(32, 34, 37); + btnSysConfig.Cursor = Cursors.Hand; + btnSysConfig.Dock = DockStyle.Left; + btnSysConfig.EnteredBorderColor = Color.FromArgb(165, 37, 37); + btnSysConfig.EnteredColor = Color.FromArgb(32, 34, 37); + btnSysConfig.Font = new Font("Microsoft Sans Serif", 12F); + btnSysConfig.Image = Properties.Resources.sys_config1; + btnSysConfig.ImageAlign = ContentAlignment.MiddleCenter; + btnSysConfig.InactiveColor = Color.FromArgb(32, 34, 37); + btnSysConfig.Location = new Point(67, 5); + btnSysConfig.Name = "btnSysConfig"; + btnSysConfig.PressedBorderColor = Color.FromArgb(165, 37, 37); + btnSysConfig.PressedColor = Color.FromArgb(165, 37, 37); + btnSysConfig.Size = new Size(42, 40); + btnSysConfig.TabIndex = 1; + btnSysConfig.TextAlignment = StringAlignment.Center; + tooltipUpload.SetToolTip(btnSysConfig, "系统配置"); + btnSysConfig.Click += btnSysConfig_Click; + // + // btnOpenUpload + // + btnOpenUpload.BackColor = Color.Transparent; + btnOpenUpload.BorderColor = Color.FromArgb(32, 34, 37); + btnOpenUpload.Cursor = Cursors.Hand; + btnOpenUpload.Dock = DockStyle.Left; + btnOpenUpload.EnteredBorderColor = Color.FromArgb(165, 37, 37); + btnOpenUpload.EnteredColor = Color.FromArgb(32, 34, 37); + btnOpenUpload.Font = new Font("Microsoft Sans Serif", 12F); + btnOpenUpload.Image = Properties.Resources.file_upload; + btnOpenUpload.ImageAlign = ContentAlignment.MiddleCenter; + btnOpenUpload.InactiveColor = Color.FromArgb(32, 34, 37); + btnOpenUpload.Location = new Point(5, 5); + btnOpenUpload.Name = "btnOpenUpload"; + btnOpenUpload.PressedBorderColor = Color.FromArgb(165, 37, 37); + btnOpenUpload.PressedColor = Color.FromArgb(165, 37, 37); + btnOpenUpload.Size = new Size(62, 40); + btnOpenUpload.TabIndex = 1; + btnOpenUpload.Tag = ""; + btnOpenUpload.TextAlignment = StringAlignment.Center; + tooltipUpload.SetToolTip(btnOpenUpload, "视频文件上传"); + btnOpenUpload.Click += btnOpenUpload_Click; + // + // pnlUpload + // + pnlUpload.BackColor = Color.White; + pnlUpload.Controls.Add(poisonPanel6); + pnlUpload.Controls.Add(panel2); + pnlUpload.Controls.Add(poisonPanel12); + pnlUpload.Controls.Add(poisonPanel4); + pnlUpload.Controls.Add(poisonPanel3); + pnlUpload.Controls.Add(poisonPanel1); + pnlUpload.Controls.Add(poisonPanel2); + pnlUpload.EdgeColor = Color.FromArgb(32, 41, 50); + pnlUpload.Location = new Point(12, 96); + pnlUpload.Name = "pnlUpload"; + pnlUpload.Padding = new Padding(5); + pnlUpload.Size = new Size(562, 676); + pnlUpload.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + pnlUpload.TabIndex = 2; + // + // poisonPanel6 + // + poisonPanel6.Controls.Add(fileListGrid); + poisonPanel6.Dock = DockStyle.Fill; + poisonPanel6.HorizontalScrollbarBarColor = true; + poisonPanel6.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel6.HorizontalScrollbarSize = 10; + poisonPanel6.Location = new Point(5, 314); + poisonPanel6.Name = "poisonPanel6"; + poisonPanel6.Size = new Size(552, 303); + poisonPanel6.TabIndex = 26; + poisonPanel6.VerticalScrollbarBarColor = true; + poisonPanel6.VerticalScrollbarHighlightOnWheel = false; + poisonPanel6.VerticalScrollbarSize = 10; + // + // fileListGrid + // + fileListGrid.AllowUserToAddRows = false; + fileListGrid.AllowUserToDeleteRows = false; + fileListGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewCellStyle1.Alignment = DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = SystemColors.Control; + dataGridViewCellStyle1.Font = new Font("Microsoft YaHei UI", 9F); + dataGridViewCellStyle1.ForeColor = SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = DataGridViewTriState.True; + fileListGrid.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; + fileListGrid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + fileListGrid.Columns.AddRange(new DataGridViewColumn[] { no, path, status, colOperator }); + dataGridViewCellStyle2.Alignment = DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = SystemColors.Window; + dataGridViewCellStyle2.Font = new Font("Microsoft YaHei UI", 9F); + dataGridViewCellStyle2.ForeColor = SystemColors.ControlText; + dataGridViewCellStyle2.SelectionBackColor = SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = DataGridViewTriState.False; + fileListGrid.DefaultCellStyle = dataGridViewCellStyle2; + fileListGrid.Dock = DockStyle.Fill; + fileListGrid.Location = new Point(0, 0); + fileListGrid.Name = "fileListGrid"; + dataGridViewCellStyle3.Alignment = DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = SystemColors.Control; + dataGridViewCellStyle3.Font = new Font("Microsoft YaHei UI", 9F); + dataGridViewCellStyle3.ForeColor = SystemColors.WindowText; + dataGridViewCellStyle3.SelectionBackColor = SystemColors.Highlight; + dataGridViewCellStyle3.SelectionForeColor = SystemColors.HighlightText; + dataGridViewCellStyle3.WrapMode = DataGridViewTriState.True; + fileListGrid.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; + fileListGrid.Size = new Size(552, 303); + fileListGrid.TabIndex = 2; + // + // no + // + no.FillWeight = 25F; + no.HeaderText = "序号"; + no.Name = "no"; + no.ReadOnly = true; + // + // path + // + path.FillWeight = 150F; + path.HeaderText = "文件路径"; + path.Name = "path"; + path.ReadOnly = true; + // + // status + // + status.FillWeight = 30F; + status.HeaderText = "状态"; + status.Name = "status"; + status.ReadOnly = true; + // + // colOperator + // + colOperator.FillWeight = 30F; + colOperator.HeaderText = "操作"; + colOperator.Name = "colOperator"; + colOperator.Resizable = DataGridViewTriState.True; + colOperator.SortMode = DataGridViewColumnSortMode.Automatic; + // + // panel2 + // + panel2.BackColor = Color.FromArgb(39, 51, 63); + panel2.Controls.Add(uploadbar); + panel2.Controls.Add(btnUpload); + panel2.Dock = DockStyle.Bottom; + panel2.EdgeColor = Color.FromArgb(32, 41, 50); + panel2.Location = new Point(5, 617); + panel2.Name = "panel2"; + panel2.Padding = new Padding(5); + panel2.Size = new Size(552, 54); + panel2.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + panel2.TabIndex = 24; + panel2.Text = "panel2"; + // + // uploadbar + // + uploadbar.Alpha = 50; + uploadbar.BackColor = Color.Transparent; + uploadbar.Background = true; + uploadbar.Background_WidthPen = 3F; + uploadbar.BackgroundPen = true; + uploadbar.ColorBackground = Color.FromArgb(37, 52, 68); + uploadbar.ColorBackground_1 = Color.FromArgb(37, 52, 68); + uploadbar.ColorBackground_2 = Color.FromArgb(41, 63, 86); + uploadbar.ColorBackground_Pen = Color.FromArgb(29, 200, 238); + uploadbar.ColorBackground_Value_1 = Color.FromArgb(28, 200, 238); + uploadbar.ColorBackground_Value_2 = Color.FromArgb(100, 208, 232); + uploadbar.ColorLighting = Color.FromArgb(29, 200, 238); + uploadbar.ColorPen_1 = Color.FromArgb(37, 52, 68); + uploadbar.ColorPen_2 = Color.FromArgb(41, 63, 86); + uploadbar.ColorProgressBar = Color.FromArgb(29, 200, 238); + uploadbar.ColorValue_Transparency = 200; + uploadbar.CyberProgressBarStyle = ReaLTaiizor.Enum.Cyber.StateStyle.Custom; + uploadbar.Dock = DockStyle.Left; + uploadbar.Font = new Font("Arial", 11F); + uploadbar.ForeColor = Color.FromArgb(245, 245, 245); + uploadbar.Lighting = false; + uploadbar.LinearGradient_Background = false; + uploadbar.LinearGradient_Value = false; + uploadbar.LinearGradientPen = false; + uploadbar.Location = new Point(5, 5); + uploadbar.Maximum = 100; + uploadbar.Minimum = 0; + uploadbar.Name = "uploadbar"; + uploadbar.PenWidth = 10; + uploadbar.ProgressText = true; + uploadbar.RGB = false; + uploadbar.Rounding = true; + uploadbar.RoundingInt = 70; + uploadbar.Size = new Size(316, 44); + uploadbar.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + uploadbar.StartDrawingValue = 0; + uploadbar.TabIndex = 9; + uploadbar.Tag = "Cyber"; + uploadbar.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + uploadbar.Timer_RGB = 300; + uploadbar.Value = 0; + uploadbar.Visible = false; + // + // btnUpload + // + btnUpload.BackColor = Color.Transparent; + btnUpload.BackgroundImage = Properties.Resources.upload_to_server_01; + btnUpload.BackgroundImageLayout = ImageLayout.Center; + btnUpload.Cursor = Cursors.Hand; + btnUpload.Dock = DockStyle.Right; + btnUpload.Location = new Point(487, 5); + btnUpload.Name = "btnUpload"; + btnUpload.Size = new Size(60, 44); + btnUpload.TabIndex = 7; + tooltipUpload.SetToolTip(btnUpload, "全部上传"); + btnUpload.UseSelectable = true; + btnUpload.UseVisualStyleBackColor = false; + btnUpload.Click += btnUpload_Click; + // + // poisonPanel12 + // + poisonPanel12.Controls.Add(btnAddfiles); + poisonPanel12.Controls.Add(btnSelFile); + poisonPanel12.Controls.Add(btnAddDirectory); + poisonPanel12.Controls.Add(btnSelDirectory); + poisonPanel12.Dock = DockStyle.Top; + poisonPanel12.HorizontalScrollbarBarColor = true; + poisonPanel12.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel12.HorizontalScrollbarSize = 10; + poisonPanel12.Location = new Point(5, 258); + poisonPanel12.Margin = new Padding(5); + poisonPanel12.Name = "poisonPanel12"; + poisonPanel12.Padding = new Padding(10); + poisonPanel12.Size = new Size(552, 56); + poisonPanel12.TabIndex = 19; + poisonPanel12.VerticalScrollbarBarColor = true; + poisonPanel12.VerticalScrollbarHighlightOnWheel = false; + poisonPanel12.VerticalScrollbarSize = 10; + // + // btnAddfiles + // + btnAddfiles.BackgroundImage = Properties.Resources.add_files; + btnAddfiles.BackgroundImageLayout = ImageLayout.Center; + btnAddfiles.Cursor = Cursors.Hand; + btnAddfiles.Dock = DockStyle.Right; + btnAddfiles.Location = new Point(302, 10); + btnAddfiles.Name = "btnAddfiles"; + btnAddfiles.Size = new Size(60, 36); + btnAddfiles.TabIndex = 12; + tooltipUpload.SetToolTip(btnAddfiles, "添加文件"); + btnAddfiles.UseSelectable = true; + btnAddfiles.Click += btnAddfiles_Click; + // + // btnSelFile + // + btnSelFile.BackgroundImage = Properties.Resources.select_file; + btnSelFile.BackgroundImageLayout = ImageLayout.Center; + btnSelFile.Cursor = Cursors.Hand; + btnSelFile.Dock = DockStyle.Right; + btnSelFile.Location = new Point(362, 10); + btnSelFile.Name = "btnSelFile"; + btnSelFile.Size = new Size(60, 36); + btnSelFile.TabIndex = 10; + tooltipUpload.SetToolTip(btnSelFile, "选择文件"); + btnSelFile.UseSelectable = true; + btnSelFile.Click += btnSelFile_Click; + // + // btnAddDirectory + // + btnAddDirectory.BackgroundImage = Properties.Resources.folder_add; + btnAddDirectory.BackgroundImageLayout = ImageLayout.Center; + btnAddDirectory.Cursor = Cursors.Hand; + btnAddDirectory.Dock = DockStyle.Right; + btnAddDirectory.Location = new Point(422, 10); + btnAddDirectory.Name = "btnAddDirectory"; + btnAddDirectory.Size = new Size(60, 36); + btnAddDirectory.TabIndex = 11; + tooltipUpload.SetToolTip(btnAddDirectory, "添加文件夹"); + btnAddDirectory.UseSelectable = true; + btnAddDirectory.Click += btnAddDirectory_Click; + // + // btnSelDirectory + // + btnSelDirectory.BackgroundImage = Properties.Resources.open_folder; + btnSelDirectory.BackgroundImageLayout = ImageLayout.Center; + btnSelDirectory.Cursor = Cursors.Hand; + btnSelDirectory.Dock = DockStyle.Right; + btnSelDirectory.Location = new Point(482, 10); + btnSelDirectory.Name = "btnSelDirectory"; + btnSelDirectory.Size = new Size(60, 36); + btnSelDirectory.TabIndex = 9; + tooltipUpload.SetToolTip(btnSelDirectory, "选择文件夹"); + btnSelDirectory.UseSelectable = true; + btnSelDirectory.Click += btnSelDirectory_Click; + // + // poisonPanel4 + // + poisonPanel4.Controls.Add(txtDirectory); + poisonPanel4.Controls.Add(metroLabel4); + poisonPanel4.Dock = DockStyle.Top; + poisonPanel4.HorizontalScrollbarBarColor = true; + poisonPanel4.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel4.HorizontalScrollbarSize = 10; + poisonPanel4.Location = new Point(5, 202); + poisonPanel4.Margin = new Padding(5); + poisonPanel4.Name = "poisonPanel4"; + poisonPanel4.Padding = new Padding(10); + poisonPanel4.Size = new Size(552, 56); + poisonPanel4.TabIndex = 12; + poisonPanel4.VerticalScrollbarBarColor = true; + poisonPanel4.VerticalScrollbarHighlightOnWheel = false; + poisonPanel4.VerticalScrollbarSize = 10; + poisonPanel4.Visible = false; + // + // txtDirectory + // + txtDirectory.AutoCompleteCustomSource = null; + txtDirectory.AutoCompleteMode = AutoCompleteMode.None; + txtDirectory.AutoCompleteSource = AutoCompleteSource.None; + txtDirectory.BorderColor = Color.FromArgb(155, 155, 155); + txtDirectory.DisabledBackColor = Color.FromArgb(204, 204, 204); + txtDirectory.DisabledBorderColor = Color.FromArgb(155, 155, 155); + txtDirectory.DisabledForeColor = Color.FromArgb(136, 136, 136); + txtDirectory.Dock = DockStyle.Fill; + txtDirectory.Enabled = false; + txtDirectory.Font = new Font("Microsoft Sans Serif", 10F); + txtDirectory.HoverColor = Color.FromArgb(102, 102, 102); + txtDirectory.Image = null; + txtDirectory.IsDerivedStyle = true; + txtDirectory.Lines = null; + txtDirectory.Location = new Point(104, 10); + txtDirectory.MaxLength = 32767; + txtDirectory.Multiline = false; + txtDirectory.Name = "txtDirectory"; + txtDirectory.ReadOnly = false; + txtDirectory.Size = new Size(438, 36); + txtDirectory.Style = ReaLTaiizor.Enum.Metro.Style.Light; + txtDirectory.StyleManager = null; + txtDirectory.TabIndex = 6; + txtDirectory.TextAlign = HorizontalAlignment.Left; + txtDirectory.ThemeAuthor = "Taiizor"; + txtDirectory.ThemeName = "MetroLight"; + txtDirectory.UseSystemPasswordChar = false; + txtDirectory.WatermarkText = ""; + // + // metroLabel4 + // + metroLabel4.Dock = DockStyle.Left; + metroLabel4.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel4.IsDerivedStyle = true; + metroLabel4.Location = new Point(10, 10); + metroLabel4.Name = "metroLabel4"; + metroLabel4.Size = new Size(94, 36); + metroLabel4.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel4.StyleManager = null; + metroLabel4.TabIndex = 4; + metroLabel4.Text = "文件目录"; + metroLabel4.TextAlign = ContentAlignment.MiddleCenter; + metroLabel4.ThemeAuthor = "Taiizor"; + metroLabel4.ThemeName = "MetroLight"; + // + // poisonPanel3 + // + poisonPanel3.Controls.Add(versionList); + poisonPanel3.Controls.Add(metroLabel1); + poisonPanel3.Dock = DockStyle.Top; + poisonPanel3.HorizontalScrollbarBarColor = true; + poisonPanel3.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel3.HorizontalScrollbarSize = 10; + poisonPanel3.Location = new Point(5, 147); + poisonPanel3.Name = "poisonPanel3"; + poisonPanel3.Padding = new Padding(10); + poisonPanel3.Size = new Size(552, 55); + poisonPanel3.TabIndex = 11; + poisonPanel3.VerticalScrollbarBarColor = true; + poisonPanel3.VerticalScrollbarHighlightOnWheel = false; + poisonPanel3.VerticalScrollbarSize = 10; + // + // versionList + // + versionList.Dock = DockStyle.Fill; + versionList.DrawMode = DrawMode.OwnerDrawFixed; + versionList.FlatStyle = FlatStyle.Flat; + versionList.Font = new Font("Segoe UI", 12F); + versionList.FormattingEnabled = true; + versionList.ItemHeight = 30; + versionList.Location = new Point(104, 10); + versionList.Name = "versionList"; + versionList.Size = new Size(438, 36); + versionList.TabIndex = 4; + versionList.SelectedIndexChanged += versionList_SelectedIndexChanged; + versionList.Validating += versionList_Validating; + // + // metroLabel1 + // + metroLabel1.Dock = DockStyle.Left; + metroLabel1.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel1.IsDerivedStyle = true; + metroLabel1.Location = new Point(10, 10); + metroLabel1.Name = "metroLabel1"; + metroLabel1.Size = new Size(94, 35); + metroLabel1.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel1.StyleManager = null; + metroLabel1.TabIndex = 3; + metroLabel1.Text = "文件版本"; + metroLabel1.TextAlign = ContentAlignment.MiddleCenter; + metroLabel1.ThemeAuthor = "Taiizor"; + metroLabel1.ThemeName = "MetroLight"; + tooltipUpload.SetToolTip(metroLabel1, "可以输入或选择版本号"); + // + // poisonPanel1 + // + poisonPanel1.BackColor = Color.Gray; + poisonPanel1.Controls.Add(cameraList); + poisonPanel1.Controls.Add(metroLabel2); + poisonPanel1.Dock = DockStyle.Top; + poisonPanel1.HorizontalScrollbarBarColor = true; + poisonPanel1.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel1.HorizontalScrollbarSize = 10; + poisonPanel1.Location = new Point(5, 89); + poisonPanel1.Name = "poisonPanel1"; + poisonPanel1.Padding = new Padding(10); + poisonPanel1.Size = new Size(552, 58); + poisonPanel1.TabIndex = 9; + poisonPanel1.VerticalScrollbarBarColor = true; + poisonPanel1.VerticalScrollbarHighlightOnWheel = false; + poisonPanel1.VerticalScrollbarSize = 10; + // + // cameraList + // + cameraList.BackColor = Color.FromArgb(238, 238, 238); + cameraList.Dock = DockStyle.Fill; + cameraList.DrawMode = DrawMode.OwnerDrawFixed; + cameraList.FlatStyle = FlatStyle.Flat; + cameraList.Font = new Font("Segoe UI", 12F); + cameraList.FormattingEnabled = true; + cameraList.ItemHeight = 30; + cameraList.Location = new Point(104, 10); + cameraList.Name = "cameraList"; + cameraList.Size = new Size(438, 36); + cameraList.TabIndex = 3; + // + // metroLabel2 + // + metroLabel2.Dock = DockStyle.Left; + metroLabel2.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel2.IsDerivedStyle = true; + metroLabel2.Location = new Point(10, 10); + metroLabel2.Name = "metroLabel2"; + metroLabel2.Size = new Size(94, 38); + metroLabel2.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel2.StyleManager = null; + metroLabel2.TabIndex = 2; + metroLabel2.Text = "所属相机"; + metroLabel2.TextAlign = ContentAlignment.MiddleCenter; + metroLabel2.ThemeAuthor = "Taiizor"; + metroLabel2.ThemeName = "MetroLight"; + // + // poisonPanel2 + // + poisonPanel2.Controls.Add(metroLabel3); + poisonPanel2.Dock = DockStyle.Top; + poisonPanel2.HorizontalScrollbarBarColor = true; + poisonPanel2.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel2.HorizontalScrollbarSize = 10; + poisonPanel2.Location = new Point(5, 5); + poisonPanel2.Name = "poisonPanel2"; + poisonPanel2.Padding = new Padding(10); + poisonPanel2.Size = new Size(552, 84); + poisonPanel2.TabIndex = 8; + poisonPanel2.VerticalScrollbarBarColor = true; + poisonPanel2.VerticalScrollbarHighlightOnWheel = false; + poisonPanel2.VerticalScrollbarSize = 10; + // + // metroLabel3 + // + metroLabel3.Dock = DockStyle.Fill; + metroLabel3.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Bold, GraphicsUnit.Point, 134); + metroLabel3.IsDerivedStyle = true; + metroLabel3.Location = new Point(10, 10); + metroLabel3.Name = "metroLabel3"; + metroLabel3.Size = new Size(532, 64); + metroLabel3.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel3.StyleManager = null; + metroLabel3.TabIndex = 2; + metroLabel3.Text = "文件上传"; + metroLabel3.TextAlign = ContentAlignment.MiddleCenter; + metroLabel3.ThemeAuthor = "Taiizor"; + metroLabel3.ThemeName = "MetroLight"; + // + // tooltipUpload + // + tooltipUpload.BackColor = Color.White; + tooltipUpload.BorderColor = Color.FromArgb(204, 204, 204); + tooltipUpload.ForeColor = Color.FromArgb(170, 170, 170); + tooltipUpload.IsDerivedStyle = true; + tooltipUpload.OwnerDraw = true; + tooltipUpload.Style = ReaLTaiizor.Enum.Metro.Style.Light; + tooltipUpload.StyleManager = null; + tooltipUpload.ThemeAuthor = "Taiizor"; + tooltipUpload.ThemeName = "MetroLight"; + // + // btn_save + // + btn_save.BackColor = Color.Transparent; + btn_save.BackgroundImage = Properties.Resources.save_icon; + btn_save.BackgroundImageLayout = ImageLayout.Center; + btn_save.Cursor = Cursors.Hand; + btn_save.Dock = DockStyle.Right; + btn_save.Location = new Point(388, 5); + btn_save.Name = "btn_save"; + btn_save.Size = new Size(60, 50); + btn_save.TabIndex = 7; + tooltipUpload.SetToolTip(btn_save, "保存参数"); + btn_save.UseSelectable = true; + btn_save.UseVisualStyleBackColor = false; + btn_save.Click += btn_save_Click; + // + // pnlConfig + // + pnlConfig.BackColor = Color.White; + pnlConfig.Controls.Add(panel1); + pnlConfig.Controls.Add(poisonPanel11); + pnlConfig.Controls.Add(poisonPanel10); + pnlConfig.Controls.Add(poisonPanel9); + pnlConfig.Controls.Add(poisonPanel8); + pnlConfig.Controls.Add(poisonPanel7); + pnlConfig.Controls.Add(metroLabel5); + pnlConfig.EdgeColor = Color.FromArgb(32, 41, 50); + pnlConfig.Location = new Point(28, 111); + pnlConfig.Name = "pnlConfig"; + pnlConfig.Padding = new Padding(5); + pnlConfig.Size = new Size(463, 734); + pnlConfig.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + pnlConfig.TabIndex = 5; + pnlConfig.Visible = false; + pnlConfig.Click += btn_save_Click; + // + // panel1 + // + panel1.BackColor = Color.FromArgb(39, 51, 63); + panel1.Controls.Add(btn_save); + panel1.Dock = DockStyle.Bottom; + panel1.EdgeColor = Color.FromArgb(32, 41, 50); + panel1.Location = new Point(5, 669); + panel1.Name = "panel1"; + panel1.Padding = new Padding(5); + panel1.Size = new Size(453, 60); + panel1.SmoothingType = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + panel1.TabIndex = 17; + panel1.Text = "panel1"; + // + // poisonPanel11 + // + poisonPanel11.Controls.Add(txt_ftp_password); + poisonPanel11.Controls.Add(metroLabel6); + poisonPanel11.Dock = DockStyle.Top; + poisonPanel11.HorizontalScrollbarBarColor = true; + poisonPanel11.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel11.HorizontalScrollbarSize = 10; + poisonPanel11.Location = new Point(5, 289); + poisonPanel11.Name = "poisonPanel11"; + poisonPanel11.Padding = new Padding(10); + poisonPanel11.Size = new Size(453, 55); + poisonPanel11.TabIndex = 16; + poisonPanel11.VerticalScrollbarBarColor = true; + poisonPanel11.VerticalScrollbarHighlightOnWheel = false; + poisonPanel11.VerticalScrollbarSize = 10; + // + // txt_ftp_password + // + // + // + // + txt_ftp_password.CustomButton.Image = null; + txt_ftp_password.CustomButton.Location = new Point(282, 1); + txt_ftp_password.CustomButton.Name = ""; + txt_ftp_password.CustomButton.Size = new Size(33, 33); + txt_ftp_password.CustomButton.Style = ReaLTaiizor.Enum.Poison.ColorStyle.Blue; + txt_ftp_password.CustomButton.TabIndex = 1; + txt_ftp_password.CustomButton.Theme = ReaLTaiizor.Enum.Poison.ThemeStyle.Light; + txt_ftp_password.CustomButton.UseSelectable = true; + txt_ftp_password.CustomButton.Visible = false; + txt_ftp_password.Dock = DockStyle.Fill; + txt_ftp_password.Font = new Font("Microsoft YaHei UI", 12F); + txt_ftp_password.FontSize = ReaLTaiizor.Extension.Poison.PoisonTextBoxSize.Medium; + txt_ftp_password.Location = new Point(127, 10); + txt_ftp_password.MaxLength = 32767; + txt_ftp_password.Name = "txt_ftp_password"; + txt_ftp_password.PasswordChar = '*'; + txt_ftp_password.ScrollBars = ScrollBars.None; + txt_ftp_password.SelectedText = ""; + txt_ftp_password.SelectionLength = 0; + txt_ftp_password.SelectionStart = 0; + txt_ftp_password.ShortcutsEnabled = true; + txt_ftp_password.Size = new Size(316, 35); + txt_ftp_password.TabIndex = 18; + txt_ftp_password.UseSelectable = true; + txt_ftp_password.WaterMarkColor = Color.FromArgb(109, 109, 109); + txt_ftp_password.WaterMarkFont = new Font("Segoe UI", 12F, FontStyle.Italic, GraphicsUnit.Pixel); + // + // metroLabel6 + // + metroLabel6.Dock = DockStyle.Left; + metroLabel6.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel6.IsDerivedStyle = true; + metroLabel6.Location = new Point(10, 10); + metroLabel6.Name = "metroLabel6"; + metroLabel6.Size = new Size(117, 35); + metroLabel6.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel6.StyleManager = null; + metroLabel6.TabIndex = 5; + metroLabel6.Text = "文件服务密码"; + metroLabel6.TextAlign = ContentAlignment.MiddleCenter; + metroLabel6.ThemeAuthor = "Taiizor"; + metroLabel6.ThemeName = "MetroLight"; + // + // poisonPanel10 + // + poisonPanel10.Controls.Add(txt_ftp_user); + poisonPanel10.Controls.Add(metroLabel10); + poisonPanel10.Dock = DockStyle.Top; + poisonPanel10.HorizontalScrollbarBarColor = true; + poisonPanel10.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel10.HorizontalScrollbarSize = 10; + poisonPanel10.Location = new Point(5, 234); + poisonPanel10.Name = "poisonPanel10"; + poisonPanel10.Padding = new Padding(10); + poisonPanel10.Size = new Size(453, 55); + poisonPanel10.TabIndex = 15; + poisonPanel10.VerticalScrollbarBarColor = true; + poisonPanel10.VerticalScrollbarHighlightOnWheel = false; + poisonPanel10.VerticalScrollbarSize = 10; + // + // txt_ftp_user + // + // + // + // + txt_ftp_user.CustomButton.Image = null; + txt_ftp_user.CustomButton.Location = new Point(282, 1); + txt_ftp_user.CustomButton.Name = ""; + txt_ftp_user.CustomButton.Size = new Size(33, 33); + txt_ftp_user.CustomButton.Style = ReaLTaiizor.Enum.Poison.ColorStyle.Blue; + txt_ftp_user.CustomButton.TabIndex = 1; + txt_ftp_user.CustomButton.Theme = ReaLTaiizor.Enum.Poison.ThemeStyle.Light; + txt_ftp_user.CustomButton.UseSelectable = true; + txt_ftp_user.CustomButton.Visible = false; + txt_ftp_user.Dock = DockStyle.Fill; + txt_ftp_user.Font = new Font("Microsoft YaHei UI", 12F); + txt_ftp_user.FontSize = ReaLTaiizor.Extension.Poison.PoisonTextBoxSize.Medium; + txt_ftp_user.Location = new Point(127, 10); + txt_ftp_user.MaxLength = 32767; + txt_ftp_user.Name = "txt_ftp_user"; + txt_ftp_user.PasswordChar = '\0'; + txt_ftp_user.ScrollBars = ScrollBars.None; + txt_ftp_user.SelectedText = ""; + txt_ftp_user.SelectionLength = 0; + txt_ftp_user.SelectionStart = 0; + txt_ftp_user.ShortcutsEnabled = true; + txt_ftp_user.Size = new Size(316, 35); + txt_ftp_user.TabIndex = 19; + txt_ftp_user.UseSelectable = true; + txt_ftp_user.WaterMarkColor = Color.FromArgb(109, 109, 109); + txt_ftp_user.WaterMarkFont = new Font("Segoe UI", 12F, FontStyle.Italic, GraphicsUnit.Pixel); + // + // metroLabel10 + // + metroLabel10.Dock = DockStyle.Left; + metroLabel10.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel10.IsDerivedStyle = true; + metroLabel10.Location = new Point(10, 10); + metroLabel10.Name = "metroLabel10"; + metroLabel10.Size = new Size(117, 35); + metroLabel10.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel10.StyleManager = null; + metroLabel10.TabIndex = 3; + metroLabel10.Text = "文件服务账号"; + metroLabel10.TextAlign = ContentAlignment.MiddleCenter; + metroLabel10.ThemeAuthor = "Taiizor"; + metroLabel10.ThemeName = "MetroLight"; + // + // poisonPanel9 + // + poisonPanel9.Controls.Add(txt_server_port); + poisonPanel9.Controls.Add(metroLabel9); + poisonPanel9.Dock = DockStyle.Top; + poisonPanel9.HorizontalScrollbarBarColor = true; + poisonPanel9.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel9.HorizontalScrollbarSize = 10; + poisonPanel9.Location = new Point(5, 179); + poisonPanel9.Name = "poisonPanel9"; + poisonPanel9.Padding = new Padding(10); + poisonPanel9.Size = new Size(453, 55); + poisonPanel9.TabIndex = 14; + poisonPanel9.VerticalScrollbarBarColor = true; + poisonPanel9.VerticalScrollbarHighlightOnWheel = false; + poisonPanel9.VerticalScrollbarSize = 10; + // + // txt_server_port + // + // + // + // + txt_server_port.CustomButton.Image = null; + txt_server_port.CustomButton.Location = new Point(282, 1); + txt_server_port.CustomButton.Name = ""; + txt_server_port.CustomButton.Size = new Size(33, 33); + txt_server_port.CustomButton.Style = ReaLTaiizor.Enum.Poison.ColorStyle.Blue; + txt_server_port.CustomButton.TabIndex = 1; + txt_server_port.CustomButton.Theme = ReaLTaiizor.Enum.Poison.ThemeStyle.Light; + txt_server_port.CustomButton.UseSelectable = true; + txt_server_port.CustomButton.Visible = false; + txt_server_port.Dock = DockStyle.Fill; + txt_server_port.Font = new Font("Microsoft YaHei UI", 12F); + txt_server_port.FontSize = ReaLTaiizor.Extension.Poison.PoisonTextBoxSize.Medium; + txt_server_port.Location = new Point(127, 10); + txt_server_port.MaxLength = 32767; + txt_server_port.Name = "txt_server_port"; + txt_server_port.PasswordChar = '\0'; + txt_server_port.ScrollBars = ScrollBars.None; + txt_server_port.SelectedText = ""; + txt_server_port.SelectionLength = 0; + txt_server_port.SelectionStart = 0; + txt_server_port.ShortcutsEnabled = true; + txt_server_port.Size = new Size(316, 35); + txt_server_port.TabIndex = 20; + txt_server_port.UseSelectable = true; + txt_server_port.WaterMarkColor = Color.FromArgb(109, 109, 109); + txt_server_port.WaterMarkFont = new Font("Segoe UI", 12F, FontStyle.Italic, GraphicsUnit.Pixel); + // + // metroLabel9 + // + metroLabel9.Dock = DockStyle.Left; + metroLabel9.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel9.IsDerivedStyle = true; + metroLabel9.Location = new Point(10, 10); + metroLabel9.Name = "metroLabel9"; + metroLabel9.Size = new Size(117, 35); + metroLabel9.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel9.StyleManager = null; + metroLabel9.TabIndex = 3; + metroLabel9.Text = "文件服务端口"; + metroLabel9.TextAlign = ContentAlignment.MiddleCenter; + metroLabel9.ThemeAuthor = "Taiizor"; + metroLabel9.ThemeName = "MetroLight"; + // + // poisonPanel8 + // + poisonPanel8.Controls.Add(txt_ftp_server); + poisonPanel8.Controls.Add(metroLabel8); + poisonPanel8.Dock = DockStyle.Top; + poisonPanel8.HorizontalScrollbarBarColor = true; + poisonPanel8.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel8.HorizontalScrollbarSize = 10; + poisonPanel8.Location = new Point(5, 124); + poisonPanel8.Name = "poisonPanel8"; + poisonPanel8.Padding = new Padding(10); + poisonPanel8.Size = new Size(453, 55); + poisonPanel8.TabIndex = 13; + poisonPanel8.VerticalScrollbarBarColor = true; + poisonPanel8.VerticalScrollbarHighlightOnWheel = false; + poisonPanel8.VerticalScrollbarSize = 10; + // + // txt_ftp_server + // + // + // + // + txt_ftp_server.CustomButton.Image = null; + txt_ftp_server.CustomButton.Location = new Point(282, 1); + txt_ftp_server.CustomButton.Name = ""; + txt_ftp_server.CustomButton.Size = new Size(33, 33); + txt_ftp_server.CustomButton.Style = ReaLTaiizor.Enum.Poison.ColorStyle.Blue; + txt_ftp_server.CustomButton.TabIndex = 1; + txt_ftp_server.CustomButton.Theme = ReaLTaiizor.Enum.Poison.ThemeStyle.Light; + txt_ftp_server.CustomButton.UseSelectable = true; + txt_ftp_server.CustomButton.Visible = false; + txt_ftp_server.Dock = DockStyle.Fill; + txt_ftp_server.Font = new Font("Microsoft YaHei UI", 12F); + txt_ftp_server.FontSize = ReaLTaiizor.Extension.Poison.PoisonTextBoxSize.Medium; + txt_ftp_server.Location = new Point(127, 10); + txt_ftp_server.MaxLength = 32767; + txt_ftp_server.Name = "txt_ftp_server"; + txt_ftp_server.PasswordChar = '\0'; + txt_ftp_server.ScrollBars = ScrollBars.None; + txt_ftp_server.SelectedText = ""; + txt_ftp_server.SelectionLength = 0; + txt_ftp_server.SelectionStart = 0; + txt_ftp_server.ShortcutsEnabled = true; + txt_ftp_server.Size = new Size(316, 35); + txt_ftp_server.TabIndex = 21; + txt_ftp_server.UseSelectable = true; + txt_ftp_server.WaterMarkColor = Color.FromArgb(109, 109, 109); + txt_ftp_server.WaterMarkFont = new Font("Segoe UI", 12F, FontStyle.Italic, GraphicsUnit.Pixel); + // + // metroLabel8 + // + metroLabel8.Dock = DockStyle.Left; + metroLabel8.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel8.IsDerivedStyle = true; + metroLabel8.Location = new Point(10, 10); + metroLabel8.Name = "metroLabel8"; + metroLabel8.Size = new Size(117, 35); + metroLabel8.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel8.StyleManager = null; + metroLabel8.TabIndex = 3; + metroLabel8.Text = "文件服务地址"; + metroLabel8.TextAlign = ContentAlignment.MiddleCenter; + metroLabel8.ThemeAuthor = "Taiizor"; + metroLabel8.ThemeName = "MetroLight"; + // + // poisonPanel7 + // + poisonPanel7.Controls.Add(txt_server_url); + poisonPanel7.Controls.Add(metroLabel7); + poisonPanel7.Dock = DockStyle.Top; + poisonPanel7.HorizontalScrollbarBarColor = true; + poisonPanel7.HorizontalScrollbarHighlightOnWheel = false; + poisonPanel7.HorizontalScrollbarSize = 10; + poisonPanel7.Location = new Point(5, 69); + poisonPanel7.Name = "poisonPanel7"; + poisonPanel7.Padding = new Padding(10); + poisonPanel7.Size = new Size(453, 55); + poisonPanel7.TabIndex = 12; + poisonPanel7.VerticalScrollbarBarColor = true; + poisonPanel7.VerticalScrollbarHighlightOnWheel = false; + poisonPanel7.VerticalScrollbarSize = 10; + // + // txt_server_url + // + // + // + // + txt_server_url.CustomButton.Image = null; + txt_server_url.CustomButton.Location = new Point(282, 1); + txt_server_url.CustomButton.Name = ""; + txt_server_url.CustomButton.Size = new Size(33, 33); + txt_server_url.CustomButton.Style = ReaLTaiizor.Enum.Poison.ColorStyle.Blue; + txt_server_url.CustomButton.TabIndex = 1; + txt_server_url.CustomButton.Theme = ReaLTaiizor.Enum.Poison.ThemeStyle.Light; + txt_server_url.CustomButton.UseSelectable = true; + txt_server_url.CustomButton.Visible = false; + txt_server_url.Dock = DockStyle.Fill; + txt_server_url.Font = new Font("Microsoft YaHei UI", 12F); + txt_server_url.FontSize = ReaLTaiizor.Extension.Poison.PoisonTextBoxSize.Medium; + txt_server_url.Location = new Point(127, 10); + txt_server_url.MaxLength = 32767; + txt_server_url.Name = "txt_server_url"; + txt_server_url.PasswordChar = '\0'; + txt_server_url.ScrollBars = ScrollBars.None; + txt_server_url.SelectedText = ""; + txt_server_url.SelectionLength = 0; + txt_server_url.SelectionStart = 0; + txt_server_url.ShortcutsEnabled = true; + txt_server_url.Size = new Size(316, 35); + txt_server_url.TabIndex = 22; + txt_server_url.UseSelectable = true; + txt_server_url.WaterMarkColor = Color.FromArgb(109, 109, 109); + txt_server_url.WaterMarkFont = new Font("Segoe UI", 12F, FontStyle.Italic, GraphicsUnit.Pixel); + // + // metroLabel7 + // + metroLabel7.Dock = DockStyle.Left; + metroLabel7.Font = new Font("微软雅黑", 12F, FontStyle.Regular, GraphicsUnit.Point, 0); + metroLabel7.IsDerivedStyle = true; + metroLabel7.Location = new Point(10, 10); + metroLabel7.Name = "metroLabel7"; + metroLabel7.Size = new Size(117, 35); + metroLabel7.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel7.StyleManager = null; + metroLabel7.TabIndex = 3; + metroLabel7.Text = "WEB服务地址"; + metroLabel7.TextAlign = ContentAlignment.MiddleCenter; + metroLabel7.ThemeAuthor = "Taiizor"; + metroLabel7.ThemeName = "MetroLight"; + // + // metroLabel5 + // + metroLabel5.Dock = DockStyle.Top; + metroLabel5.Font = new Font("Microsoft YaHei UI", 15F, FontStyle.Bold, GraphicsUnit.Point, 134); + metroLabel5.IsDerivedStyle = true; + metroLabel5.Location = new Point(5, 5); + metroLabel5.Name = "metroLabel5"; + metroLabel5.Size = new Size(453, 64); + metroLabel5.Style = ReaLTaiizor.Enum.Metro.Style.Light; + metroLabel5.StyleManager = null; + metroLabel5.TabIndex = 3; + metroLabel5.Text = "参数修改"; + metroLabel5.TextAlign = ContentAlignment.MiddleCenter; + metroLabel5.ThemeAuthor = "Taiizor"; + metroLabel5.ThemeName = "MetroLight"; + // + // mainForm + // + AutoScaleDimensions = new SizeF(7F, 17F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(599, 823); + Controls.Add(pnlUpload); + Controls.Add(pnlConfig); + Controls.Add(panelToolbar); + Controls.Add(hopeFormMain); + FormBorderStyle = FormBorderStyle.None; + MaximumSize = new Size(2560, 1400); + MinimumSize = new Size(190, 40); + Name = "mainForm"; + StartPosition = FormStartPosition.CenterScreen; + FormClosed += mainForm_FormClosed; + Load += mainForm_Load; + panelToolbar.ResumeLayout(false); + pnlUpload.ResumeLayout(false); + poisonPanel6.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)fileListGrid).EndInit(); + panel2.ResumeLayout(false); + poisonPanel12.ResumeLayout(false); + poisonPanel4.ResumeLayout(false); + poisonPanel3.ResumeLayout(false); + poisonPanel1.ResumeLayout(false); + poisonPanel2.ResumeLayout(false); + pnlConfig.ResumeLayout(false); + panel1.ResumeLayout(false); + poisonPanel11.ResumeLayout(false); + poisonPanel10.ResumeLayout(false); + poisonPanel9.ResumeLayout(false); + poisonPanel8.ResumeLayout(false); + poisonPanel7.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private ReaLTaiizor.Forms.HopeForm hopeFormMain; + private ReaLTaiizor.Controls.Panel panelToolbar; + private ReaLTaiizor.Controls.Button btnOpenUpload; + private ReaLTaiizor.Controls.Button btnSysConfig; + private ReaLTaiizor.Controls.MetroToolTip tooltipUpload; + private ReaLTaiizor.Controls.SkyLabel lblUserName; + private ReaLTaiizor.Controls.HeaderLabel headerLabel1; + private ReaLTaiizor.Controls.Panel pnlUpload; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel4; + private ReaLTaiizor.Controls.MetroTextBox txtDirectory; + private ReaLTaiizor.Controls.MetroLabel metroLabel4; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel3; + private ReaLTaiizor.Controls.MetroLabel metroLabel1; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel1; + private ReaLTaiizor.Controls.HopeComboBox cameraList; + private ReaLTaiizor.Controls.MetroLabel metroLabel2; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel2; + private ReaLTaiizor.Controls.MetroLabel metroLabel3; + private ReaLTaiizor.Controls.HopeComboBox versionList; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel12; + private ReaLTaiizor.Controls.PoisonButton btnSelFile; + private ReaLTaiizor.Controls.PoisonButton btnAddDirectory; + private ReaLTaiizor.Controls.PoisonButton btnSelDirectory; + private ReaLTaiizor.Controls.PoisonButton btnAddfiles; + private ReaLTaiizor.Controls.Panel panel2; + private ReaLTaiizor.Controls.PoisonButton btnUpload; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel6; + private DataGridView fileListGrid; + private DataGridViewTextBoxColumn no; + private DataGridViewTextBoxColumn path; + private DataGridViewTextBoxColumn status; + private DataGridViewCheckBoxColumn colOperator; + private ReaLTaiizor.Controls.CyberProgressBar uploadbar; + private ReaLTaiizor.Controls.Panel pnlConfig; + private ReaLTaiizor.Controls.Panel panel1; + private ReaLTaiizor.Controls.PoisonButton btn_save; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel11; + private ReaLTaiizor.Controls.PoisonTextBox txt_ftp_password; + private ReaLTaiizor.Controls.MetroLabel metroLabel6; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel10; + private ReaLTaiizor.Controls.PoisonTextBox txt_ftp_user; + private ReaLTaiizor.Controls.MetroLabel metroLabel10; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel9; + private ReaLTaiizor.Controls.PoisonTextBox txt_server_port; + private ReaLTaiizor.Controls.MetroLabel metroLabel9; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel8; + private ReaLTaiizor.Controls.PoisonTextBox txt_ftp_server; + private ReaLTaiizor.Controls.MetroLabel metroLabel8; + private ReaLTaiizor.Controls.PoisonPanel poisonPanel7; + private ReaLTaiizor.Controls.PoisonTextBox txt_server_url; + private ReaLTaiizor.Controls.MetroLabel metroLabel7; + private ReaLTaiizor.Controls.MetroLabel metroLabel5; + } +} diff --git a/MainForm.cs b/MainForm.cs new file mode 100644 index 0000000..c4dfc7f --- /dev/null +++ b/MainForm.cs @@ -0,0 +1,486 @@ +using edu.huvtc.utils; +using FileProcessClient.domain; +using FileProcessClient.utils; +using Newtonsoft.Json.Linq; +using System.Diagnostics; +using System.Security.AccessControl; + +namespace FileProcessClient +{ + public partial class mainForm : Form + { + private static List uploadFiles; + + private static string remotePath; + + private static bool isUploading = false; + + public mainForm() + { + InitializeComponent(); + } + + private void btnUpload_MouseHover(object sender, EventArgs e) + { + + } + + private void btnOpen_Click(object sender, EventArgs e) + { + + } + + private void mainForm_FormClosed(object sender, FormClosedEventArgs e) + { + Application.Exit(); + } + + //private + + private void btnSelDirectory_Click(object sender, EventArgs e) + { + addDirectoryToList(0); + } + + private void changeButtonState(int status) + { + switch (status) + { + case 1: + btnUpload.BackgroundImage = Properties.Resources.upload_to_server; + btnUpload.Enabled = true; + break; + case 2: + btnUpload.BackgroundImage = Properties.Resources.upload_to_server_01; + btnUpload.Enabled = false; + break; + case 3: + btnSelDirectory.Enabled = false; + btnSelFile.Enabled = false; + btnUpload.Enabled = false; + uploadbar.Visible = true; + break; + case 4: + btnSelDirectory.Enabled = true; + btnSelFile.Enabled = true; + btnUpload.Enabled = false; + uploadbar.Visible = false; + break; + + + } + } + + private void addToTable(List list) + { + clearTable(); + foreach (var item in list) + { + int index = fileListGrid.Rows.Add(); + fileListGrid.Rows[index].Cells[0].Value = index + 1; + fileListGrid.Rows[index].Cells[1].Value = item; + fileListGrid.Rows[index].Cells[2].Value = "´ýÉϴ«"; + } + + } + + private void clearTable() + { + while (fileListGrid.Rows.Count != 0) + { + fileListGrid.Rows.RemoveAt(0); + } + } + + private async void loadCameraData() + { + List list = await HttpUtils.getCameraList(); + foreach (ComboboxItem item in list) + { + cameraList.Items.Add(item); + } + list = await HttpUtils.getVersionList(); + foreach (ComboboxItem item in list) + { + + versionList.Items.Add(item); + } + } + + private void getAllMediaFile(string path, List list) + { + try + { + DirectoryInfo dir = new DirectoryInfo(path); + + var allowedExtensions = new[] { ".mov", ".mp4", ".mkv", ".rmvb", ".json",".jpg",".png" }; + var files = Directory + .GetFiles(path) + .Where(file => allowedExtensions.Any(file.ToLower().EndsWith)) + .ToList(); + foreach (string file in files) + { + list.Add(file); + } + + // Get all subdirectories + DirectoryInfo[] subDirs = dir.GetDirectories(); + foreach (DirectoryInfo subDir in subDirs) + { + // Recursively list files in subdirectories + getAllMediaFile(subDir.FullName, list); + } + } + catch (Exception ex) + { + Console.WriteLine($"An error occurred: {ex.Message}"); + } + } + + private void showFileUploadProgress(int index) + { + if (uploadFiles == null || uploadFiles.Count == 0) + { + uploadbar.Value = 0; + } + else + { + int percent = (index * 100) / uploadFiles.Count; + uploadbar.Value = percent; + } + } + + private void processResponse(int index, int i) + { + showFileUploadProgress(index); + //Trace.WriteLine(i); + if (i == -1) + { + fileListGrid.Rows[index].Cells[2].Value = "Éϴ«ʧ°Ü"; + } + else if (i < 100) + { + fileListGrid.Rows[index].Cells[2].Value = "ÒÑÉϴ«" + i + "%"; + } + else + { + fileListGrid.Rows[index].Cells[2].Value = "ÒÑÍê³É"; + } + } + + private void mainForm_Load(object sender, EventArgs e) + { + DateTime now = DateTime.Now; + //txtVersion.Text = now.ToString("yyyyMMddHHmmss"); + lblUserName.Text = CommonUtils.getUser()!.Name; + btnOpenUpload_Click(sender, e); + loadCameraData(); + loadConfigData(); + } + + + + + private void btnUpload_Click(object sender, EventArgs e) + { + doUploadFiles(); + } + + private async void doUploadFiles() + { + if (uploadFiles == null || uploadFiles.Count == 0) + { + MessageBox.Show("ÇëѡÔñҪÉϴ«µÄÎļþ»òĿ¼"); + return; + } + var item = cameraList.SelectedItem; + if (item == null) + { + MessageBox.Show("ÇëѡÔñËùÊôÏà»ú"); + return; + } + + var versionItem = versionList.SelectedItem; + if (versionItem == null) + { + string str = versionList.Text; + if(str==null || str.Length == 0) + { + MessageBox.Show("ÇëѡÔñ»òÐÂÔö°汾ºÅ"); + return; + } + else + { + versionItem = new ComboboxItem(str, 0); + } + } + + if (versionItem.GetType() == typeof(string)) + { + string value = (string)versionItem; + versionItem = new ComboboxItem(value, 0); + } + + changeButtonState(3); + + ComboboxItem item1 = (ComboboxItem)item; + ComboboxItem item2 = (ComboboxItem)versionItem; + + string remotePath = "/" + item1.Text + "/" + item2.Text; + + //string remotePath = item1.Text + "/" + item2.Text; + //Trace.Write("==================" + remotePath); + + List list = getMediaFileItemList(uploadFiles, remotePath); + + bool flag = await FileUploadUtils.UploadFilesAsync(list, remotePath, processResponse); + + if (flag) + { + MediaFileInfo fileInfo = new MediaFileInfo(); + fileInfo.fileItems = list; + fileInfo.deviceId = item1.Value.ToString()!; + fileInfo.deviceName = item1.Text; + fileInfo.version = item2.Text; + //Trace.WriteLine("==============="+item2.Value); + string str = (string)item2.Value; + fileInfo.versionId = int.Parse(str==null?"0": str); + //Trace.WriteLine("========"+ fileInfo.versionId); + fileInfo.remotePath = remotePath; + await HttpUtils.saveMediaFileInfo(fileInfo); + changeButtonState(4); + } + } + + private bool isMediaFile(String name) + { + if (name.ToLower().EndsWith(".mov") || name.ToLower().EndsWith(".mp4") || name.ToLower().EndsWith(".jpg") || name.ToLower().EndsWith(".png") || name.ToLower().EndsWith(".bmp")) + { + return true; + } + else + { + return false; + } + } + + private bool isValidFile(String name) + { + if (name.ToLower().EndsWith(".json") || name.ToLower().EndsWith(".mov") || name.ToLower().EndsWith(".mp4") || name.ToLower().EndsWith(".jpg") || name.ToLower().EndsWith(".png") || name.ToLower().EndsWith(".bmp")) + { + return true; + } + else + { + return false; + } + + } + + private List getMediaFileItemList(List uploadFiles, string remotePath) + { + //remotePath = "/data5/file/xuebao" + remotePath; + List list = new List(); + foreach (string name in uploadFiles) + { + MediaFileItem item = new MediaFileItem(); + //item.fileType = FileUploadUtils.getFileExt(name); + item.fileName = name; + string filename = FileUploadUtils.getFileName(name); + bool isValid = false; + if (filename.ToLower().EndsWith(".json")) + { + item.urlPath = remotePath + "/json/" + filename; + isValid = true; + } + else if (isMediaFile(filename)) + { + item.urlPath = remotePath + "/media/" + filename; + isValid = true; + } + if (isValid) + { + item.time = FileUploadUtils.getFileCreateDataTime(name); + list.Add(item); + } + } + return list; + } + + private void addFileToList(int type) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Multiselect = true; + openFileDialog.Filter = "Ïà»úÎļþ|*.mp4;*.avi;*.mkv;*.mov;*.wmv;*.flv;*.json|All Files|*.*"; + openFileDialog.RestoreDirectory = true; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + if (uploadFiles == null) + { + uploadFiles = new List(); + } + if (type == 0) + { + uploadFiles.Clear(); + } + foreach (var fileName in openFileDialog.FileNames) + { + if (isValidFile(fileName)) + { + uploadFiles.Add(fileName); + } + } + addToTable(uploadFiles); + changeButtonState(1); + } + } + private void btnSelFile_Click(object sender, EventArgs e) + { + addFileToList(0); + } + + private void btnSysConfig_Click(object sender, EventArgs e) + { + pnlUpload.Visible = false; + pnlConfig.Dock = DockStyle.Fill; + pnlConfig.Visible = true; + } + + private void btnOpenUpload_Click(object sender, EventArgs e) + { + pnlConfig.Visible = false; + pnlUpload.Dock = DockStyle.Fill; + pnlUpload.Visible = true; + } + + private void loadConfigData() + { + string str = CommonUtils.readFromFile("common", "server_url"); + txt_server_url.Text = str; + + str = CommonUtils.readFromFile("ftp_server", "server_ip"); + txt_ftp_server.Text = str; + + str = CommonUtils.readFromFile("ftp_server", "server_port"); + txt_server_port.Text = str; + + str = CommonUtils.readFromFile("ftp_server", "ftp_user"); + txt_ftp_user.Text = CommonUtils.DecryptToString(Convert.FromBase64String(str)); + + str = CommonUtils.readFromFile("ftp_server", "ftp_password"); + txt_ftp_password.Text = CommonUtils.DecryptToString(Convert.FromBase64String(str)); + + } + + private void btn_save_Click(object sender, EventArgs e) + { + string str = txt_server_url.Text; + if (str == "") + { + MessageBox.Show("WEB·þÎñµØַ²»ÄÜΪ¿Õ"); + return; + } + CommonUtils.writeToIni("common", "server_url", str); + + str = txt_ftp_server.Text; + if (str == "") + { + MessageBox.Show("Îļþ·þÎñµØַ²»ÄÜΪ¿Õ"); + return; + } + CommonUtils.writeToIni("ftp_server", "server_ip", str); + + str = txt_server_port.Text; + if (str == "") + { + MessageBox.Show("Îļþ·þÎñ¶˿ڲ»ÄÜΪ¿Õ"); + return; + } + CommonUtils.writeToIni("ftp_server", "server_port", str); + + str = txt_ftp_user.Text; + if (str == "") + { + MessageBox.Show("Îļþ·þÎñÕ˺Ų»ÄÜΪ¿Õ"); + return; + } + str = Convert.ToBase64String(CommonUtils.EncryptString(str)); + CommonUtils.writeToIni("ftp_server", "ftp_user", str); + + str = txt_ftp_password.Text; + if (str == "") + { + MessageBox.Show("Îļþ·þÎñÃÜÂ벻ÄÜΪ¿Õ"); + return; + } + str = Convert.ToBase64String(CommonUtils.EncryptString(str)); + CommonUtils.writeToIni("ftp_server", "ftp_password", str); + MessageBox.Show("ÅäÖÃÒѱ£´æ"); + + } + + private void addDirectoryToList(int type) + { + using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog()) + { + if (folderBrowserDialog.ShowDialog() == DialogResult.OK) + { + string selectedDirectoryPath = folderBrowserDialog.SelectedPath; + txtDirectory.Text = selectedDirectoryPath; + if (uploadFiles == null) + { + uploadFiles = new List(); + } + if (type == 0) + { + uploadFiles.Clear(); + } + getAllMediaFile(selectedDirectoryPath, uploadFiles); + + addToTable(uploadFiles); + + if (uploadFiles.Count > 0) + { + changeButtonState(1); + } + else + { + //clearTable(); + changeButtonState(2); + } + } + } + } + + private void btnAddDirectory_Click(object sender, EventArgs e) + { + addDirectoryToList(1); + } + + private void versionList_Validating(object sender, System.ComponentModel.CancelEventArgs e) + { + if (!versionList.Items.Contains(versionList.Text) && !string.IsNullOrEmpty(versionList.Text)) + { + versionList.Items.Add(versionList.Text); + } + } + + private void versionList_SelectedIndexChanged(object sender, EventArgs e) + { + if (versionList.SelectedIndex == -1 && !versionList.Items.Contains(versionList.Text) && !string.IsNullOrEmpty(versionList.Text)) + { + ComboboxItem versionItem = new ComboboxItem(versionList.Text, 0); + versionList.Items.Add(versionItem); + versionList.SelectedItem = versionItem; + } + } + + private void btnAddfiles_Click(object sender, EventArgs e) + { + addFileToList(1); + } + } + + +} diff --git a/MainForm.resx b/MainForm.resx new file mode 100644 index 0000000..87dd442 --- /dev/null +++ b/MainForm.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAEoAAABACAYAAAC9S+EXAAAABGdBTUEAALGPC/xhBQAAArZJREFUeF7t + mbGK1UAUhrcW7Gz0CazsrGzsbG0WZJEVLLRRudyJW2eyWIjIqg+giIoPIIgPYKVYWLnOZHVR2MZOsV5P + YIK5kzNz/8R4M9Hzw8fC7vx7h4+T4SZZywp72Bely0trS6Lyj8eywnzn+k2UNg9cJZpMm/dcv4kqzBu3 + PJpM24dc32eu7XpvUehmaN0jrt+EJH3bur171FWCyYryGtdvkX865SrBqGLvNNtl+CNRyGZuFuUZtutB + 6zZdJRh0MmnNfVeJBpnMmt6i6JK75z4vGpqUD1zf47VbHg2te+z1WqCTSfu/zvVD9BKFXybmBtf3Ufnn + k64SDDqZxEVXCQafzN/0naghN7PjKtGsejJ9+ohCN/PE67XAJ9PO/C7HwJO5QGdRw27GbLhKMLNb+8fB + ybzrKtGAk9miq6ghNwNNptL2KdNdgL5+HAw5mRywqA6bmftdjmEns7zgKsF0mEyWDhMFbkbbn3y/ibnj + KtEMfIA/83qdQEWBmzHPme4C1WReyQ+OuEowNE0Z1/f5mwd4E0yUNlezbXs2xrywl9lumx2u34TOpXPI + ZNK6l1y/RWF2uX4Xuh7m/y0iCkREgYgoEBEFIqJARBSIiAIRUSAiCkREgYwjStt39HOmtPnR+luijCXq + bXVXv5V/OUE3tq/YNYkxqqg6ars8T7/7yq5NhCREVameUVXvCtn1CZCMqDrV2+cub3BXRXKi6tC6pA77 + ZEVVSemwT1pUnRQO+0mIqjL2YT8ZUXXGOuwnJ6oO/Z+VHvaTFVVllYf99EUV5gX7GQMjlx6IHOYgkxEl + Xw+AyBfOJZFbGEAUrZOb4pgoeczShBElD+44PFHyKDiEEyUvF5Yhr6v+XUQUiIgCEVEgIgpERIGIKBAR + BSKiQEQUiIgCEVEgIgpERIGIKBARBTLXdv0X9/j2tcAXujEAAAAASUVORK5CYII= + + + + 17, 17 + + + True + + + True + + + True + + + True + + + 25 + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..f5248eb --- /dev/null +++ b/Program.cs @@ -0,0 +1,23 @@ +namespace FileProcessClient +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new LoginForm()); + if (Application.OpenForms.Count == 0) + { + return; + } + + //Application.Run(new mainForm()); + } + } +} \ No newline at end of file diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0e0187f --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,253 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace FileProcessClient.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FileProcessClient.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap Account { + get { + object obj = ResourceManager.GetObject("Account", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap add_files { + get { + object obj = ResourceManager.GetObject("add-files", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap avatar { + get { + object obj = ResourceManager.GetObject("avatar", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap avatar1 { + get { + object obj = ResourceManager.GetObject("avatar1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap file_loading { + get { + object obj = ResourceManager.GetObject("file-loading", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap file_upload { + get { + object obj = ResourceManager.GetObject("file-upload", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap folder_add { + get { + object obj = ResourceManager.GetObject("folder-add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap open_folder { + get { + object obj = ResourceManager.GetObject("open-folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap open_folder1 { + get { + object obj = ResourceManager.GetObject("open-folder1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap open_folder2 { + get { + object obj = ResourceManager.GetObject("open-folder2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap save_icon { + get { + object obj = ResourceManager.GetObject("save-icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap select_file { + get { + object obj = ResourceManager.GetObject("select-file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sys_config { + get { + object obj = ResourceManager.GetObject("sys-config", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sys_config1 { + get { + object obj = ResourceManager.GetObject("sys-config1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap sys_logo { + get { + object obj = ResourceManager.GetObject("sys-logo", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap upload_file { + get { + object obj = ResourceManager.GetObject("upload-file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap upload_to_server { + get { + object obj = ResourceManager.GetObject("upload-to-server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap upload_to_server_01 { + get { + object obj = ResourceManager.GetObject("upload-to-server-01", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap video_icon { + get { + object obj = ResourceManager.GetObject("video-icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..8cc4ee9 --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\sys-config.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\upload-to-server-01.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\open-folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\save-icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\file-loading.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\open-folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\avatar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\folder-add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\sys-logo.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\upload-to-server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\open-folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\avatar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\file-upload.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\video-icon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\upload-file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Account.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\select-file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\sys-config.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\add-files.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Resources/Account.png b/Resources/Account.png new file mode 100644 index 0000000000000000000000000000000000000000..34d2ab971298380ad309d6d8e87472d891c2e065 GIT binary patch literal 7132 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 literal 0 HcmV?d00001 diff --git a/Resources/add-files.png b/Resources/add-files.png new file mode 100644 index 0000000000000000000000000000000000000000..98883b09de42d9a91d7249f0b4639be55ec57568 GIT binary patch literal 1480 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 literal 0 HcmV?d00001 diff --git a/Resources/file-upload.png b/Resources/file-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd308eb81c508a21bf1b4626166bac6a7b48148 GIT binary patch literal 1074 zcmV-21kL-2P)Px&>`6pHR9HvtmrH0|WfaH%=eswLX~?swjje?yK3Z@i6xyytMBLcuLRu&^R*}YP zH+G`p(v>1Mf?%w&$E z9IESF0mpu46$vyaE;F+K6siUUCBdQ*evQUc=a)Ox0Ayy@3~kux zqyU$|sjGlg8j1ub2jmz0?L^o<7`HtD&dknPYs2bhVOJJg&T@^gPIPp`)j-wpLC9#aJ+?Gy@=z8}#wxC6pKZq7INH6j+rem36bO~L06oi)9i_ev=TIPTjM(50mUD;s;6 z#^&BzeoXoF{tH6<2r8MnX`+JUt?_u57hr1Z33Ly=P|sVr3_HI#N(bh@^t0p0;G}jU z3<@4GCha86k>r36!0`L%-gqPsKr65c(cQE^{zE;;Dny9FzBXYr*mYlhvy2(xx-#@U1}Mo;tnYV{LALncKQ>AleL@m(w*=m+PHmv7Pe_` zIj}0K#a3|h-QZJ0^>vy^zU`?2_YXbQ`=}WEjM~@)&u4)TmZLC50TtZ_)9@STH$bM5 sPQ6KQpmtYl=+&|sEjs)Uu;vQ<3rKA0FlSV5g8%>k07*qoM6N<$f-&6)`2YX_ literal 0 HcmV?d00001 diff --git a/Resources/folder-add.png b/Resources/folder-add.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd1d2d65982b1613977071649615628d6d293ee GIT binary patch literal 515 zcmV+e0{s1nP)Px$y-7qtR9HvtmcMJ;Kpe&2S5C=VD1?9q+tSd2&!J@LoXum>5g^oul#eN%z%v-CEZGRHu>Z zSbWR=07#Xjr-J!qLA|d7kr_a@Sbz9CcjgO_2f3>P_hl*of?sqJlVXG@K%^M$-Bib* zoRovcRuq@526V|us=zf80XPU(bnB#vlbrE6${T7eGY#m%4Ba*ZxW^MP?JySMC>Nyt z6Kadlblw0wSAn~oXv3@l+J&7`KNr50FnnG9(foK7bmBJjEqfi11Cp&u;BHObr8fq#J$?IF`oBVGUi002ovPDHLk FV1lO;>*fFe literal 0 HcmV?d00001 diff --git a/Resources/open-folder.png b/Resources/open-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8ea966a340c4f093649ae21804e5923735d734 GIT binary patch literal 671 zcmV;Q0$}}#P)Px%SxH1eR9HvtmOE$^Q51&1Gx1eeC>Dybk$_RK5p}UnBZxXPNhvSJONHcHdeA&42aF6$lQ>G z5&-pZfhj}6GP4X1sByd|C5_K!*6V+oL*q;0Q7#5omBLJOcH4FSk@YnBt zv6(di&?GU0nV@DBU2-^p`4^F|KvQ(1%%OY}mmMbJey)1l1pxgpJBP7V0J-0G}T}ZI7e2rt`@Vp*?&B4IIhGtJ+RR4o*bjv4}ci3wh545C}}K)#O8agKJDM~wgWA9;4gdH)gj1q*uMY(002ovPDHLk FV1iD5AFu!b literal 0 HcmV?d00001 diff --git a/Resources/open-folder1.png b/Resources/open-folder1.png new file mode 100644 index 0000000000000000000000000000000000000000..17f25c9e7dbbc02c29b1ca6fd441688140fc9dc3 GIT binary patch literal 1338 zcmV-A1;zS_P)Px(^hrcPRCr$PnrnzuWf;eQ&+N9AL80ZUv6?Lg24)2jMYoM=!^`fR*$OJC#EPOm zY!`y)LVZvou&@ZEEW;qWpnJ}wO)lAu$}WCLii$20DN<{ap>3A5`!qA`=9x1)=RT*A zIq%o=Jpcdm{@>?)&wF`dN5)?j^uZV3xywGw>OT1`1l3 zJT{G-c%Zyl#`NFz(uyfP?Dp?6v1LsG^mS%4%1;irWn%C`SW+!;9DlPO;qtH;Hosw7 znI%iu7X_=f00W#xhOaBYk7AB2t`a3MznVOcuq?2n(?M7wS>A|(<0im-GJIJ9KFW0I zV^0*qabGpL2VrF-EMcBx`8EnhFacVaCOzzpLTLBZJabWcfHP4}4v71zvx z02ZeMUsQMqGbGDURMJNBPX(wo8rt+3FhKPp*haf7;@2Q4T;56#vjAaI5WmQ_t$goi zpHR0&P&YG`gRDX5i`<#;04v1cK{xkc0tCnawfGn~H+<|dd3tQM>mq=fT#2wgrY=N< zIY1j7vWWc?0R_%Im(tn%D@ z+Ma%7IZ=esLH{WEk)Z+TIwdsCBD2>lgA89JqxACnOv&)q1G+sKB*U`E}0URwE;3>H5lwA-?8 zo8&mhi$Au%fSP=Y*a(#;CC8m!0mSjW$i1-0U2tIa7k__GdEv(*fNr3J7Irz(?>y<{ z6R!Z`_^uW&0oU0^e}qZQ^mB5JM*xc(pyF-irKsk4xcF4^2+GS$ z<`%hvVLt&xwNaBngl-$o0gk6#F5xdf*s)9jKScGg(E`&rRKBD=+z(})-%qA*h$FT09Ee=fGbehT}QUBY@fhyv8xKRh6+kCPo!$z4}-aS2r-T z{B9|nU^Dtk4CV(7#;ZQyU7*VWx&_!8xIQ3gWN!Atjldj7cHSyEo()RlE`Ui_u{@?E zLZi3sVsKWNAiZmZELH&bhXGH>XQ*@sAz6M1!{;eL2~_j+qpS);P-mY~0ms#1I0`ue zkopp!EW#!_8KI|KCkUs6tP>0nT20eKz|LZs%|}tnb;i+s3lK--jfjy7(1@dwWK3xW wB&l{Ia-|v2h@+BZOlbxrsdgiBHGKyB3#_(`P&{B2HUIzs07*qoM6N<$f(?IRu>b%7 literal 0 HcmV?d00001 diff --git a/Resources/save-icon.png b/Resources/save-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32472b96cd690f256ba79b09600ec2a7ef705ff1 GIT binary patch literal 456 zcmV;(0XP1MP)Px$f=NU{R9Hvtm%UEHU>JqZDT7f5W892b5~B|Olxy%3G$sx*D2&1t7^AC$gE*Pi z&D9%mX z9m8leEf?V0_s2;JoraRGkoh>wUEaUMLE?FDHT!8~PD$?c>V*!YI6@Atk-YQ3;NIg| znP39a8)7>dsRD31z$~f?+6#r6>9~t=fUcMFH2@1?TG3mO8W=SJK@U0GTkhVs`o2|` z!L6=V>gOD9qhFpx=fH2BFoZzZvD&m<{@nn;ddX@5G=e39N7HeadI*%PbAX*mDamxa z;JZJ>A_=t1uxK?vW=Cn@1msZ=qnZX-=)NELwUT6zeRIGUu0hO(#PIpFJvZ)8&D;W9 y>9?2hKbPN5px46sPx%%}GQ-RCr$PTEB18P!PUnC#XvV4WjD80MbJUm5G4~304H{Le0bmLWx<}=u}|p zAJ7CC_ygL&0s~_U3j#4QRr1h<0fb~zeyB>-`j8_M1r+nn_N(4YeVHQp?%v&Zci+4B zYylHvWbKs%TRfYsij0`A8EuamzH z!kP|8vf4m|g~*pnS@r&vrvvbJ3wU8ub`oRtc7R2l$g7V4uOd9`fj{*#uZ^(=APE`~ zH+L)5%Rg?P*vJFI*aOfD8ex0S!5dqRQ_r)4a4-P)6Ez~VqhsB>;LYq%fuI9m840Ea zi149%$h|_{D(L`NF$Yld3Imc>X)pjPg!<3x!!0mM3GrR*hJPH;O;ZmL`({zM@wXh){B+n;X!HN)&$~R1cU}g?D;3UW`pu7^x!qR!@ zA&Y(91^O2@Dx`T5R3S7t3#d34|WpA<-ybuDe+O`XneGVA94|p7$i4mrf4DH7| zee3T7hHr$zrX-Ks)b=6VI2j?qk*75VfGdDofH{ClZd5rYK_jom)RW-I_X1HPx%&`Cr=R9HvtmrqC(aTLeDZ`PG8TZ^E`a%W1jGTqrIIuwCKL{Qf~1V!$S1SNQ_ zONVYj5n&*a&aQPS=nr%-2_)(s)Nj{1g|2G~Mnq_k5j^-?(DAP%{lGxzVqH^ z-fwK&>E9ZhVFN@33%3jfqD^>K9~r1(JsTnSlMJCYsZ;)u~1k zJ*7Om9KaL-UVv{9_|wYCsFp#o`N9|k;q?4ZbZDlC77LLFFdEVSfZ$<^&uOvvyOk1+ zMq2iQlrJ(~VPzWAq}&71c`z8nS5-6qxEKgm0A^;<(3ldFsrukcfX|cyQ8qy8a&tXb zc!uO#Dzj*)dm_e%LQR#MeU;B`2qKR7&G@rIop2RE7LpLvKJRM+S^-!DHVQ$w4j>^$ z+O!R%)btbKxD&*h07!_5E43Tbne77%J|-bJgG*YUc$K>xWdkJJ1AB<+tGx?$#fHXm zlm7@cRsZ#Q2LK$Mhp<9gU*gSDUD*I*q1{!MZ`-fz9Jucv7B}fV(zy^LZNV*yhu;DS z0QjbwqQw;enPk+^2LYTYX1`}aGip>+y9O{GZmvr!o~Hng6a~R>7r-t$VH{M`IYORmz0aF)*u{!nY3KP6x6+(P;_PsMwK;=y#dW;qEsO3H}7}CWmb}shUEYGbBdf ztOxYKZ;E}cbRZSh!>r&!0RZWQd(__ei{&({o&!#^-YLEgP*MjL$F9@S%&GBz>% literal 0 HcmV?d00001 diff --git a/Resources/sys-config.png b/Resources/sys-config.png new file mode 100644 index 0000000000000000000000000000000000000000..62ecaf23aded717f9976791f4f4b6baf836768f0 GIT binary patch literal 1145 zcmV-<1cv*GP)Px(Gf6~2R9Hu~S8a$DRTzHWnccRJADJKcv3u{#vLT|&?o1XXf(4a7EXh`+56Ly} zjOY&qK?s7ri~17@S=!FrZTprY7Iv+E1VR+9m^ri8ilV?fcW?f%MUAvJx0yF)thgWN z&P=!U{G9VV&-~$XUxQ@txL1h+}fj9;|E2eo~d5|aCObxh+;YS zi10;I+o)RZJBh=}Gf@QEDI&P@LJkD)-((AE%W8whJ_1(`8L#IMP~ zP>1EZ;e08ltqX|u5J8Ew&i%YT^FjIdT5gqzqS4a{NMl4azZ%HlDl~wWrP*#~eiwu; z0^MA7WWWK{avq2^;pMcIkm!pvfttmL61eU-JX0G5=3lgfl=>MsCzL zK_vVYM`Fyo6x-dCBpl_0p??O#ss`BK!2Aj!7|q&+&!fbw1r`nMIU=gN1_5cH~c z;bfeVlA&*B!mA>T%>IfFyKqE!MJqpg59>?Of^QmJ)1O-W;Pytf!prrng(QzOFnL_D zoaLf9VcGUf?I1vRHCiz<@?ajOEBwRK81aAK;6B9~e?PqmLq7(B&~=)e z5Mr30Qf&9hR3&jAFA!m$Px&CrLy>R9Hvtm0f5QR}{zp|2z3;cV`QNZ^G^fwSrU%MPdcPK2%x+tzd;}Fzikc z6jXvQHhu;JDne;N>PM-&Ta}22A0UDi6w{Yh6kn8pg6xh#d{t&PlI+es?HW>&>}+P- zeF%lzx0!S9|NQRxxR;pa#aWJzIe`CH2432U#bdx;Y7AO=H#@n13bwfo!Y|s0qYJX` z)2O`_DFd<*ZH}2Z1;U;re5*xOwpPE(zVRE$uP1CGa>gonJ9rP3Fpy9HXEWyM4-&Ts zbW9f$z$L^07z+sWmuPp*!aQEj1Q7~QwBwzCx)64fK)cqRR=zaQ6o8X4zZ3FuV*s+j z%6nIv0w|_qYoLsqjQ}Xo-z0OTKN<#*J}AdA_k!#X5P1m5{dfNbD?ol8&?CK8(ml>T z=z0)!d%#J@)(X`zkV~d-rpTdG&O7{H*8_AiW%DP=e+dKeZy9mk({3Vrhj~6oLb&}r(2GY7Kl`oyIIZTjqF=L(pxg*G?wBI3A zsp*Ybtv3|kYT;lYxZo!%=kAUQFaUB>kdWcJF+UMM0jTb&b~%|C^?Kd*#G5(*7p$DS zB^rR8I0vA{xw_fVW1m!1YbU`&Q^Z6Lz`zw~4%Ml3K9zMdkpP@b{D@HX2KRs*Y!{p! zC58abANP@0Efp@U7}5iBf1Q2(R@OTh31B$gzQ|XtR{?%nGg=~JhQexj>pj+O=4Vy= zM`iC(sV%-jgE#*jS)&#}o+!V(KKc9T^GE>WqYXNCd^4c>0DL^H-WuSK(DFA4rGb?M zc7dESRRTOC^x;&tG{AR~wJY>3aMJPBqSWm=BRS)5Qh${?Te>roQz$^8JF%XEYYhQt ze_g!`XhJU(pqbZDiF}{Td6$~Xz;MP~`{7uRH$b&HG&=O1t$WF8uJ<|rchma8k-IdIaJgnMZ*s*24 z7y~3)C~_>>>gD(=%3;B)_Q(KH#2WFL1DMOetY_dKg0CJhA5oD800000NkvXXu0mjf D`)iA0 literal 0 HcmV?d00001 diff --git a/Resources/sys-logo.png b/Resources/sys-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5b108e4c22593c2cd9eebf9b0d050e60b0691d99 GIT binary patch literal 21798 zcmbTd19YXqvo9LklT2*ewrwXnwr$&)*qm@;Ol(YS+ng8^$Eo%`0g_nr0jTHpRu zUsZK=b#?cztD}?@BoX0o;6Ok?5T&KWRDkEezXuEy@P9zSXdHNgb(GR}0Re&k^7jA* z$;!b30fBt6QqywPl9%H#aj;`BGIcOEWAL5@CkZ48kyLbxe^(hSyS8JSoZSyr^!6^K|K=cO=3?S(<>+eVU{Cayqmi+Ln=3yF zP}6@F!OrnNZ0%kCWhS7(7(I;~8JQWF{ub#Ugr+9{p>uR|w*7~2QxirrTQfT|dsi1A zE%Se99W5PP9b7CO{tvAG^ZI`i05q+<{C{Npx4PKb{YQk0tGGL`82>WJe@pG6=H+O{ zsAA^g;O1;%ChiVYlk{(C9C<{Y&5T?foYfp0Z2w(RO8-`wNL2K1#c&f*X~yb&dS5gMa#s+!^HGYQh5hcD|4^^mXw``iS2(Q z1$vFCk*m@FC$XsskGX@hoe{9iR(3`fW{i&Z79>Rfu_TYEgRO%zP%uzC*8lokT2xfY z*}>e(7Wl$NMN))FT3nQanVW-yo`r$=AL`1>^GMsfxEk4;m`RKAlK}0*U}a^>W6H+O z&dO%QMbFC3$xP48#%4^R#?H>c_3!V+98BE)dcoiC|Jfi+9ZY~c z{vY+Y%~{yFjaXUeS&X^4=*^kgn1S3_IOvU7%vsquO;|Y1Ik^ALP0`s3*d~o^|0~zO zTA2blvT$)Tn;M(5(6h0a8q;%_vYF6xu`{vKv$Gj-axyWqvoNz7|MmQTI1`VQl?$+% zz5dmfRLz|Jb!BTs^bh~xF*5nvF8E1I{yK!2DapScTm3io_#a9B*Y_TlW*r0gVH~%hVlPhYyWunUjo>_$$?Sv@8y5OG4SR;0o}|V$l4hgt`)7V*g!xO z=A^}h)jV?!yWBk0G#@|Sx%bneI>7oi3(?cR+fl1qtL3+MbodlLER@fKm7qs_rB>OX zCnLV(Np|ACBJ@cjaw_oa?s@F45n^#M&2L=Z^0^>?Oe)rnc?v+_A;Pdk{t2EGs6_+^ z10D=2y2E9*gGaanW*Z1u4k8l>Muf?QWD4Pr_c`P8Mym9_j>rXn0)qen1>zTUDRjWy zu8Hl4vVwRH(hP2Oe4_se^T7xg2#SRm3oZfb_tEDg2|@}k*t7y&1-S(A(efU0!EGY- zDVYWW$%K)CBqt$v{24<9o(2jZL>^gk7=ZJ61~!A=3e^fH^^v|lr*i-z2)YgW`gz#Q z7X7IXngR0$-TIUR&?6>Z=LeC3Vt+bxanAlyhxLTc%=@M&eB;2mgAM?DgQPnKxOGE# z`WC216SgS&y4yPu*P*XK0KBKJmf+rMVS2>|$F)In0vH^~e9R8uC?yRDCAT`hB+@gO z)_wxEZpCt--@x7w<(|vz*U&%gKu>})2+~RQ6&e%FZst`+h)R9aF;`C^Qz05A5`%H( zWNiyl1|Jm|8z$*%{4Om*`(VhOU}s))wyR;^ba?{7JYhXM%_L<<2n4lqzDqXA6cb&X z+O&wE6|L@pg^`tdlwsb}uqjJy*b8duWqg?kwNh7G+tfNII8fm=x)5QqRy!b|7mbD& zX>KnVBZnZ#R~;3^P(a=JPf&09goQuky3SirB{aCS7!}JBpv_q8mW)Y)*(@ z6u055Y(e)L{lm#y8eu*}#CVdG^x4k?HNZmsra!i3=eGX1gc-q_P{#Ua)HWf0xNm3l zt{$n^%LC~B1-gW1Boba;GLM$KcND8lhL;m24_QXv1#*=zy$JN6%9DT0G#C6+8C{TG z&=qRw+EAey(Q<1+Kd3prN(K^~O{=L6B?AG9y8zbLGDFUBoMh0AT#SHz)XanSdq5-TNpp7v!BGT{CaA)6*Vdtp0 zb<_s3dhWD-@+70CyBB$=Fum(*Db{kab{Jqm3hM;l%jjoph2_DTw~J#xdwCEu`Zhtc z$uPrv`Jzi*zX!ZD(ibK5dC-MneMwrV5Z@;V4ZE}65z5|jr@dC309hs?C_bIilp4W6 zLNLdl-VjI-?kY;8{gsukds=MZ%!Dk!5$jHxwAw(QA7{hTw|A6ysuu|}=X_Phdzx%n z`Wcq1T~{OoV3ix*%CT-Ah8B*@3#OsOFOn}%-n)Id@q8x>I{}eGm{+ZGm`y^U#}*+2s#SydC(Xy_1}X zZa0VJO&lxPxaRC^<5&Z^P&wjtT592D+Y@z0Cw2f7Y5Pcl|*pk#$nGlWB(rQ^3U!93jo@$)Cm8C6R zE5`a{W?G=@iz0bP4+7xkBDl9k;3tiOU5dV=&5^srr}uw+X|obz8GpdouW&{+SGs!` za|J=_;m(VJ8dBa()pp)Cq(frdt{ww{J)ohaT7S#x0o$@a8>R1SLk|q=C8ZZw`%S^Y z9V%JoYC3d&vGKIwU3_3j7RR&_>*vq!vTU*c=fw)sZg1Br*Xt}Z@vXT7rCO%%#u`&l z@R`y~KOh&h+eHRO5-!Z4RCgOIx-tjko?t!RIVMJ>64xLud)0;|lbI;Krzcy%Rt84! zE%)2zg=jwB#DV^7C$K%Hpz$;XV+JUak`tlVGV%{q`9RGx%n5B=$Ug73kY@a`KB}4y zKDVyvXn-Dg`9+exnrP!eQ9TSES$)gh*ERzh+ne88ppk2~)Ziis3aPHp-Ts4-wKB(+ zS3k^Di8KtiPQ4@J&l`_@EGH{h-^7H|g_onRPxoqqyhK>Y=5*XaVkprqI$9bFuNMXq z!wFhnUXHcCwr@%X6Mv(o1&fb7g+f!3ZqHW8I%CmXMeA!a{`o`=#b7xF>9&l70=tm} z`_(3UBq8VV?SyXj^Ii!v$Xi!g2ICceDBXB#g`O`*Bjs?kT`T9&_1pRv5Kq5d)S1dm zA60|qV-40lCF&t1{zD9RvZ7M@(qpS$g;30exwYi%{?)I6FovwvGq;Ig?p`gJ`NPvg zRWuA&Uj|z5&{mq6q1$93TKz2LafT4&4WHNOn(-zK$D>_`=yIi9GxCg(Yma7Lzj&P< z`N#Shf%77#C*96i-_u0lbVMN9G!m&%vbon1%HbHv-;TE;SkL@;_TCaUB8x@@>xkeC z;E{5ERcb&^7ikUZK~7gz-Zj)}fwAWjjKbGeFaJZcAQL4SAOMpz$cpJs(KRUXrvib% z{|XF*!T*$z0e?B(!Qr>$tsm{^Xbo5hjv5?U$wHQ%h@co=KT|>Zq2AoanV^q*pru%# zm~qUslFSG>hYF7*(X&}RAuT0?)cDf3vVv5i-|gZB%5bD|Mu^CpGZClnCSHb9?)@h6 z6Ie;T@PhbcyhUK&6}m`Que%L-wn;}ZFTEAOXb{H)O@9%fhjuiz07x2hWtlb$Y2 zuC|8+X2NjZVMFKV#9<44TRCcSn3Qf%45xu!bzwALvgjzMsWMvj!MvWY5vgfE$4sNo z9W7=+4c&ahd@GbN3=tEe2=r3o+V&KoHO+y|Vx1td{U5$>#C6sfQLN zI!gwYCpANOA$sWXh6d7E8Ih|KqAWZK&z^|23+${@mRo!OXWXlDaoE@i$p{H#PcvTQ%1?WQUjU}2IJdRMl-`KT*Dx{(-!7xhfF zlIYcxszsION~Pk0K;_kc3_jmrWIkEt^nOPs-b{^zu{~+?S%ZSFHJSyM8Nb7?Ks8sO zqNKOi$+Pb_nrxsBtU0}rk+%v7;$Xz@D7YmwYbBF~A2a2H6eAaZOkBKvG0GWR@`}SxT8(XaN!)0PWsjUzpOD^s zUqO-xwB_yNA*U5tPabDz`WIyMySh0WWcug{Z4Z@<;xg=X!rx)Cg|nSXWp*5X7T?*} z9egd*N}j|aOAS4LxVe5C@MW*$)Z}9iwz$-r8rZ))XtMEP-7i${Y$uD8j~J`7OqF6W zcKxkj>0FJZz8@q5O+}Uhv=~yfh14+9OIhd){g&J-6*z@ojD$M=xdLM*IS10A?rN&~ zue5u(4~5!ZJxh#!+=?#`{;=2M#tS$L1qq&?!{9qN%9bvy1%6bm@4lb;9|xK|Bb&Oh zECMj|i||f|8ZHORw5NDA$3;!rcsu~88{ujzb49U)(E|>W3q_UXs*5e3Gg z*I&-Xb>aOXC2go5q?YBUhsLu8$~^xsrH zkz0G{rx!HHuN!*haYGS|D>SGQ$P#Qea<+NHE2m|5_Rn5XP|ZvSK8!ozV0~E(s`wRT zY*AVObE(ym<6d?jMpX?6!Z^i5aaiv}JX;qLzJ-a%mxSZ0ntu-FvtL+j)Zn^QMPTe# zUsfp~uov#-;LL}1JnivwMXWneXgXQiGE0)=^Mn%$QOkkg;U4|Vjc zLM#c3CoL>gO)_f!*cLzZs4U^4_!}u%&kqqd_((Dz%^wDtT!@i6psB}*Y(LzQnSU6e z>jFj=8HyeK-eJn|Z=N+~DqFAL$S&Ip!1rGVe>PtnL)bi~Gg+ANz<-RPuFrVhjoKTB zg#y$F}-*e%aEK~WIJs4$@!)rCo5;XU}rp=@k zk&2+`#5SLRRA#@ZKpmjrPH!xv+hM1gqAw=oTI_n3gbdWi9V@RANiBhKfzX(t#S_2!I91zN3rTk&PtBG;^c(&F|C zz>`GcB+6W%kE7L!8ws~&);WWJ3N)|sO@a`Ji766ifAhXF6lm?{Ov|x0?`{ekWa2m2 z-uOlo60N^U;$><~!__(B-?P$qrY=Pj=4m8@S}N`hd65*7`S?bqA;7;EP;;j^I5V|N z=e6hS@8`spt1_^o1=%nF4+jg28bn79-DqThdfau7nN~%!#ISO z0dc*9IMh)J3L8aJT}tyrNe-CrToy-*1PBzk2d7U8S&&R$v>!Q0>~FNb5=^(gdgh2- z#SdwjP|)$W@zvK2DVfS#r3=3I-4wWkew=bw=jlIP+$=sU>G{hvxbr>HG0?wU4nm~) zTwM(6S`+T7DLo;`naWoixYN6I@35DdV>^1*C0Fa6qd7OF5@dwa*VBZ;Lgc5v?G3L( z_s%+-wzQN?6@Sh|_pU8b1+AlMlvC7{3N^R&6$}A8yZv8Q2{3WQ|{cJRC|T&3LiUMkyd1rI$%KJ{GH`RKu4)h)mHi%#n@Np+o_GSma((c>U3$q0{a)YCV+>AR8?v<__^_|@` zslk+jIy9H((yM_P6t;mVz#dp*?izVF2xN{qtlzdBEs+;!)a{JJw-qZQ^qkX~_BHz+ z`E@9sXYR|1jNXg}jpz}YYBJjceEhv#v3A>CzSRA64uCaaloo}XC0^ekBM-ZNIozBY z?E zd<89dU*dN+ct|ogxfkEuTIHyuq65h#vFnO4blO}r2>sgwV4xP;;MJdYulUS+nliy5 z+3}uu)AQj42_ls3vNTX3_vPIZK)EgbMw| z8Z1xsf?Dl6Os{zQ8hBK~B?(Lt*gvSMgjt#`eYnt{pvtX(7o;K7*W$kYTr!~uDNaZj zx9xmgc^0e0m}qsu7L_cid)|bv`}Bq+&3g(N7Fe57y+ht@YES$g_h(s|CIRSCGXNb+9n2~#yZWZxmTK?bsU3fjnb_{4^$POryL z;&9Fn-Hjla%b#!RjR4$qQB`oz7q$A4=YNtv-pO4fS)A83eV*>KyAmuVRH)C`->p$0 zUS?HETm4*RWC<$N>sB`K=&N?M>f`oHIO5Y+SCjNdcdKY-Dtq^b4V73sRk0E&5Mc{} z;|GLd3G7oe3lfI6b6t#M`zfQP#Mvkwa0kxN;Zor45ttRZmWwjsNUCEUtF% z&*1w{XJ)AU^N$ZDt|tVeRj8vAzK;%7?uuOpOFT+4w!Uv0Quer+bKlFXU^(z<%oc;t zmI$dW9Q4`M50UD8Lfy~?W4^J$C>E*^H)sE12PF-sV{^}ib1RRxucrw2fV1$OrlPoy z7hdKWkSogQApfSV_zr92P3A&0DlQTlKYD%c)}`HC7D?5ZM*fJrTgvE>tZpb?sL^2V zQK%)N6V6uPVq(D21QA{`uFf$VpI_y=A|i&=@b`P-a}VHy z#GV24z&J!9Qg6`}>!JP7LD%uRxY@NRxr?dD^=&)i+O``zbo7Q?*&s;}{ekj$4|(3m zQ*uqSl(lN6Ee4j!)~|Q|5VN1F&qvPj@O6EqqbqO~hn!iu4oW=u6M1%((b11+jDpygH&x|`b%%B62>aMDUI6=aAwIY+^*~ z&qBuREYJtiw@J!@GfLvQ$btPLx@tT>85qbbfKa6JWT7uStKiDe)-Oq7fk+$1tN6)% zi`_N4;(}zooZEUh`;I0;LIV%;A5QE9gpAX?Bha*S^~buuE=7`hPeHq~3b4NLqfNL* zvCa~YiA7+2$&OcNdQA^Oseq1&LHc3j>n=(-R&9Svdv2PxB2C-iOtmdzAEXXpLlx== z9sw0`rq09gyZD#ufWyjd zb>PI$`U~y16DAP-jDSdyj)=Bw7biTrpm@}vp{P@Jg<8Xv6?a=-Z!ubf<;i+A@(=P*q`m+eXQ6x^N`#A%AK-2k~q0mAK7Zk4i>(9NM7Oa*Z zpWn`>>#vUsRnjgP4!(hti)_#S=)06awclB^@xB=mkDIEa?+@kVsP{f)E{@+deo&Sf zNmbZO3U=~&Pbtw9N>O(8@5Wew=Yl%ZWI>}g1R{KB^DoM$Ru>(1MHoD|sl^!}Fc(fh)E_-1;EwVgNmZj#OCF-17sb`~e!Pp-FH zp!cfW9O)xbdZ8R0!JJ+jJJtAit-525098}{!#;3a zglO}g4Y$)i?S6Z)Y%D39nM>ej?CGK5F!U$Ze)ic8BTy$rt;5rOOIYCfkE5QB))g`A zxwjnvSM<}!M}a-W{#{QC9GfL30Q!K|^amay-8NMhmjg8nW?!VxQ}pM!By!;PgZDw zjFAdLiv+w#qAw1_5DSU)g|>mYgHp#0vtl#x(Znc(9%3Y4^G3 zrERaz?5=Y@t^TYy?wrRr?Y#d(QhnF8TO^rwOM(3W+Ttz;T zqD{%4-Hni^4F;a3Tf#$+(WSC7kxE(CMY`Z0*L9bPzI=@qjf_Ric#MsA2gAIBYkGhI zM9qhtN?z#ZXK#yWS*W4Cyop4)f+7w(U8(1Y zL0-m_tW~~!z}Q^vympo_Sci|c>wLZwmgsCxbl@}<1$1qfb0j^Uv7T31d?olQld&n9 z?qBcgW%J3QCz*t@F4BV_fE{2%C8^LCxxlp5;ZS#NU4g;JbY+-b3wgbn3*NVnne_pC zf@WuIqQhdFbFRVsCcX4pR75hJ+J$%mZF8J z+?<@bwj1cKG~_Ak;!A~&fu#h?k zR?Yi(iKU7JJ^`fkRqd88A-PIKo0&KRMX20g(#Hg|IhYRpl+wN}MIb(zqD-L+1jm0= zbuM@Ac%f%_>#a!VcKdPKH(xsHw5(H%Vd?8wT%08t@UnV0$gQfTe+=#3gy>K=AAe1^ z>}j60Go;58q6)@+CX?N<%({IX4_qIw9{56C;f_i!E$8{>3*`=T*rF$13}8_#HVr!! zJAMs|Ne81Pr6}cCeJ1)^TE9v1{FK`hrp_RxS_`WSKru0X4iP=--KQRUpa>cktO!oDy~Geq-*vENr1g2TJ!whUlAH56gQYG-h`HIOWeOV{Rb!)Tfb^ylqudqA9;{w>+R%8e9~DM|_UOp$1=gG} z-~Jk@nObprjJ8}-f*paQ*Ym~Ao$kgnh+k4Lwxj;{jKgA~jZl&Pa&?wwU5FYLUd+cB zGv_O;hUO#Y5>0e%2SuXeTv$F9YK+uH`n2$H<>lojdKt0nCpH9Xp*Himo$Dv8r+o4g z$;rb~-Ev$pzcMzau@HZgHo`j;i{U<1XK&CZ|qSe|cEGGQ6)E)`xU@jOB%M3T!dIi{fEUG7w*0K1#T z0pS95rbg%Ej^64!@>Lj>G7Oh$Lvv!_4tWv(@mJN>hTE`EAqM6W5$zOW)V8#e)QCGH z9(9q)BUN(`f8I=QjDB5Nq+ohkOp^h%usJ#SaLe%|cHFn>Qpe|BPXzn{@fs5lf^`3J@OS=$A;>=37FeAn;(8usJI zFQ}uw9@B;#f~-j>Au`2QiweKclr9ZbKDFf5npa;X-4OOuBf>?x#S_G2gmN-l1U5%K z0*--t?^bP1_}I}&N13CB>ltH`9@#R$qm2Y1P;wW63@ygS?^EFw=(&E#Kp-zxTd-hr4C$m_>NMkrK`P@-xk zwor$&Cn&?@7J^&E8G(URY;H|(p-<40Pf(tmOn)?deEpK?C)>kwJWUuOi+$TGtRcer(f*p!auNty_3!hJx5!X^{#uD$P-Q+_B#;+&7-S53f~ID*Hczd4u@PPY;XY6 zV|O>Eqt4cX7>H&zFn0yNKWhLdimjc-=2Q*JY8QN`1Pb2>W$cVcK~ZfB)dHnOZDXSf zkI7knXtH4<$5ZzE-ZtMgiA#FE-EHorl4n8wvi%V^ZGbzRkdnaa{{inUQ6!BpWaqTB zN^M#)n8Q9Soc4UZkMD|=CuW|9(Y7&l!Rq6@`7FJHaeb2Rvr^w7HE5XEjdu^_n#5+K zthqB|<$)x}?Hs60OEna_y>B7p%ryTpZZb_d0A02P$p_Dffm@nI$Rzm&to+B;k1>tQEr7XfNQxRI}|E zhX0dcwdH(096@&gj03>^p?^ZMr#{Lpz@r7QZ_;-SDKG;tL;Cbdt{R%86vQVg@j+*NtIIbbZyrML-vSmExTwSTnM|a~-F7@@pQ58zwW2L$7KKQY zOX9~ZG>5{=6Q;mSv2;bnH~L0pq3QBT|L%EQF%KTS7Ck`D(Z1OX0T3u|CAxkNo6|G~ z??~TzH*T{7@YY~udFp_StOjp0Hd^Wme7@gt(Q+I{XY_lbZZW)?NzooRRC?du=~*lb z|5*qg=;Q5*i#Sij;R2t<4SoZa=*d)zrz!%X908BQ+PI?f$%b8CMF#HjMaWFced4C0eW* zhJ&i^&>CflrEccDSr0}@hI-(#RHCncBooOviw|;|<7*8Vfh_E9e|NpyIsRmw!Y*09 z(TGOa;;*Bk!zv!7{yjZ$)3VfMm#>y$u8jzeRl&;1D%0M_;Cp(%Q%F((#6iP~>Gp}f zjnwJe$Cr>{gC?rtV@GrEEq+a9%qA#8KGIoDCw36nM);;>=_gA3 ziqj|2+q;DZ!;apRkS25aH8Wz{jX6np@G9jqpr$Rzo&FC!{Do829vt zIyUCn5fr~4YmGT}w$^S?e_vt_Za1NtA=pGNrIWKh zKIGVTf4%w{@OVH7Dq{71N~Vk^V&m>5-rYS<>xvVHMxz&-u@v>^8)7A|?{l{?gJngQ_Z0R8T}@xjMO@UkTm(tN%zfg>78 zD83>=b{PQNJBP?7yd1S%_y#`gdPm2n zslGC)q$HXE$KKcXIzNrP0gDWE?FncTTvhf7WV@6>rLB-87%FNS8N}2XZ^1Y;HXD?z#y)<7VZRkR4pxV%3Zs1QZn4UpNYmG{{_II7Ng0V2 zi3LP!)M`Yh*!`^FvF{yXL`Nz8>HLByZ}_VFW#$vy{G?UseY6ckzb6AR76+iwLbMdg z9@Smxw{(PB0kZZ}NfyLg-7naJ{*6WX$fYPOKiVdO?0Vd0UkpONu*t4wV~GeQu&*9Y zBHnKJVR^XlJpzEDY(9CKD9{jFjDTWenNnStTOB41%63&?4}mDqK`4Uw84CgeSYu3M zztRs>DHEBh5%^;LP>M>$CoTcW%5d7>ek}1`bf_VMXh)K1j|2rdGZqZvAd=F%K8~pIGOK~X0$*v9abb;SOEEQj0t+8JdJvjNj>El{2%UU7!)?4;fn>;MQUL zEP0BB>58tdjWb(H=;V~bJA&0kZvHIH=;G#bgaj>4CWUtkqxpV3nW>1}kMsgD4;STatY!hhXk5~`VoYu3EVrNESmrp% zL#H{8>TLABW*#DK2n19%hbT@64#rJ~*2Q{+~ z3rRRY`RHJdI5+sVW98Mgts(60sg%t|*Xe_@reWX9GJX-f1tmmn>7O|mNb9=>y{^@8P`*RJg4~n_`wGWt-xg#!oQiQ(6}4nIM2GNrI8e|_wFyX zbnq1MOZsKvN<>;?B(c7m;l)dS+>0bETyr1{jHt>INhAnZuGS46m`QItG!5H%y?ws4 z=ZwPabg+RA97m4ty1HVrq;ZJ!;M_Djo}2j%u?K(VYfZ35Z_NF-RR?QdqhVRCl~y)f zPtm6$g@OkZb?=G{WhD()CH(PyxKL>;f z`ozUu^^faWg z%L4E=_k+u8oRZo2GCKkA(6?0(kQqbvJd8n{X=QgO>)FIowAPGlRp6!-fiJGO(qN6@ zVZ3l!tt3SsWF=r@_%q~q&+DgjtGZ%An**DqNlLUB?LHSRMkmw*s0b2Gqlh{ zvo|p@EA6#dwK`5BtDLj@Ztwo#V090U*zilH(NgA>*(a8y(;G8o>R^t)3t5bD)o|TG zj5Tgv&CvA)^^$`#XNGcr4aJVV)G@T=6XT1l=IY7!r2+E1%*mz|Po?bJLI_|JeQ(~$ zi;s0Ze-DR{EHi7ZtMLhWSA(d58`nIJ7O3P6vXYLo3}O*a_x}bbr(4q=#1tgh37REY z1XL0418=9~JcS-ZhHH&`K0hh~!}}zdqL1 zZti)q?F?y*@29bNk5r*?d>=18E3LB*fUP;VE_bW9K}Szr>AjGQM*iN}D>4`tLtX1+ z;_>Qfv}?q(amy?FkRJJ?$LSmruj%(mjkzw#IHZcU@c-a{1$gBYbqJE-r6hRxw8+1E=Nh;NKSB+`0@<;9xB%dN07a7J=vjx4fv zzV*b}7K8vuIM{D0vl}XH@V}oyn_J4+gR;SQ9$>rQQF66j-~PnInG(rO&*eg{00ef& z?V+}9$H)bj=kU5lu|>f+2xukY=A(eqJ-AA}&NrVm?k>i_^FO{XT+w=KA0&XwlN+VEom@r_7q6jZ_Ha~$I-$!2kN|i3&rxJ$sk4tQJDm^mQo-o zXwD_z3o@;I4TnR5h>R}Wu{tDJic&3jM=*8%>=y; zd05U;zuwW=uIJF2FM;qz0`@7$sWUp^p!H)a?PDmZ(MP2Fsr4AJ+x6jtql=unw;UC@uR1)2-C;$>rEhJasM9ur z?fA-+*%Vvbh2yC&K;%z-58O71l!++sn4S2L4>M^@;Bv5vZK>-W7f3&JHp}kHS>UD}ss3 zDjF8}Dmg*Mpk;raNYN6Z+i@%e>u@)OW5e#SU}IgAABG?bVhoXA6eyx@XN1z~&?_iA zddGe}R_z=ix9mdZy&a-x#$NSKdmxjrNyX44;Catuc5q)E{Q_{%gmDt$z(KN;m`xn+ zH(%-KEj{EE&K>>uhM^`^W(N1Z-ufQ#zH_f~e(%(|5H3;z(wJtL8$A%F@qkCS>luYF zU#>t_#=~c+2B#swmVz5j8AX&hRG%SqJa8&kxSi+jS)Ej@d6OT*>+*Vneu=dnA1oxM zWYm=W9fy;!YV=_K%;#?H0vxvIiIU=*L3cvFG$G zjV+f3v1ho-zzBWa?Og>z4gq014C&dov_$nwAq+FqttGySYWu#eQgvmkJ0)AEdj5`f z?y@Bh$`7XskSd5VMSjtTmstwPFE&fJmtzPu*jZ8$RHSIv7o`9+#>`;@tHXOKrp9Y2 z?Atyxj*?XP_OC6PFbNvJ{ewk5T74H`AfKq}3igDX@iZOK0X5>L z!kn?S+~jNDiBs=McXpEnlxgdZbu9_a$jJM92cb0!rC9a_)yAGxd1o1=XPN=b_2B6U zv1K;jGqnlrh7YevAR$MJOtH}>CO(`wHG%2(Z|2Qmp8*3keDJk??W%QE&}mdX1ERL& z1nuJA)uaG3{Lw9f+w!0O^#Bf*Oq7tU^*nueZwyUj`JEw$hiJ0dq2-_4W&SfW2nmpH zPJ7TvB4Cx-h^H6;UOLox%{@UaI9PK41EE0rx7vKHDe{ng?e3lo{l{v<<-WOgTXmsg zTinG06_!6Gh+LoIzbgBWzIH-;1;5i)mrIwN=7>U3bo~_WEF!YYRUye_tJ=y4nJPFc zMIB99YAqa-E^{a5<7p#>gJl3t1`K+*!UrHVy7L31RuFN94029hkPGVNPhEOPT`^Ii z^k4i5Bet?fXdM)VoS(7g*ulu_h^vDiHHsT8Gz*#FC9x70qURsK3t&?-ME<^qqv&pq za#Q5cUbxNKeFJ7AxgQJFYpn4PvgsQi685FEv?w{ZBK$B}84bck1Ljw`D59F=<4sZ8 zH1=LtY$md35Yidxnqz46#11jC?oLkj#|3=X{V?TQpNWWr?UjIV(ZXL$HJww+)B9!T z@_5_l*0q|UF~vJR|NMT%r`%5`#|V=wB;~00152n7W%MhW)Qzyzg@{%UNv@BI$kWd6 zW=#|;T3`-KZRPNz!+t$vgjV-SB+(vM)4pkfoX!ClEhD{vjCLHZh#RmOu z2QQeR(Cr5Vll`mjGf zA;jrMQ?8H}uzf=Zd{7t}Bfi;4nWTWC_e4wMSp5t>*$Yawp4-)%sJLX|^2%!St9P~% zyeZ>weiWZf%)LPcR3?fS2x2-oGpTEE+IV0z+zUmOldZL8-jfV|e6q2r^Yh`if|Y-R zNJXvpmXRLJ!e01eixZ@rk8Vc7x6zw$ndqvBXd>1kWe$WSc$fbG5uEGEY3M|e`~FN| z`i`|a6fAy!D2dnC9sQ24XSxomexL829#`T4t0g4*pyjPE)}5~pq+t-MUZ)tAPzXYq zWMEYE$o#=Brz$D4%3AsUUsvr#S#7Z%7<>AiuimM6-3D)aMMoGovkFD0T5|<$$B&0B zmPJ~HTkSD|gw^-qGCaVcWnlW0r25-6FZLdOnW)f-g zdUDkjk|UFiv!twfT^{-K@pi#qRY@IpIXo7|v(M6VhvMWn;LMUA=(!4rK$Q5|v&?6c!xtLPyKBTE4QdRQjCZ2Ndwb~1C zch9q%hBObqH}1^K?=9gpA8C4--=WD=OG|!D+K@y3BR=*oh5<($hZ$Y17TwT|3rT-!>Fdb}%KP%j9*H`2+07kl~ugi+nUx?Kk{bLV} zZhPvNn5cXmxupH9!l_@c}C8=vONBI*XzGQWUdLM?0-Q_aLx}#KP;3h2Q8Ge6azTf7&0r2v!0&I*R zAj|B})dmt3H%#pTbd>@*gC8D@hC|u9GnJ`T0e*P3z-(#adSNW%5UOWi9PQe;!w=jS zmI99yDbxEW$YI0QJZOXM5kHql4zG^1f};@RS@+-3ECTwz1!@H#IcH0II&E-g^V8o! z*hC|Y{T{q-UK9Fu9+aHV=vR8)a8`}`Qq$vhb(AH?yZrg>^Px8nqU`LK_kq)&sdUar zoL)+n?9|m$CbA&^QR0agU(CKj9+eKU-XJu#SqX+q%<;qxYoV{jdN^iXTZ?R23}6!D z5Jb41jrELXEy%e#eR|0%*xT&E8IIu4TY0^R1IbTrJ_0KFirg6vea#Qv&E^_LGv%Jg z;R0_T*G$4amp4%tMhRc{CObc$87O+*Fc-_n9GlVez@eQ|F-%%(K33I#{1B_vi*P@; zync16eg~f?PcM{{Eh|43D~=8}nPkHC}0Wy{{Y8<`rNl3%uHcV72E3 z2V}smB^tR?eC&U`^Cc-!}jfjxtOsYv$=9v=ap5+z;g@+8{v78m^0$2%3srdVH( z&9gfLvB#!r8Cx?tZhYG8MU5Gqj<=lcqN_D8cQlfjd%szW?COA|OSdFuGMsEf*rd{?{P&$Ve-v{ou_!AIZ_Q z8uFJ6%+PssL@X^IYch^olS&q@@( zs;FHFL~1=!;0Qjyec&f2<4~?f&;obomL+hDX!`#OM-jO0+lfsMMyFPim2XAXCqj~+BUQ8bx-)O`9rKNaw??#!@4u#o_=g1K>g9aiQ40!hK!*l2m3Y`w!#TTD; zu5-y!WUCeZr87WX?@IOMw< zks9D_4&V#m=9ad#wE_Slpzw5Sh$Pi*1&K63z7?vSEcj>&m-LV2vsD?`d@_$MIE35o zspA#~kX>FRmygo97qjYM2{Z3s2~i^N9iv)Q(e(M5GBSlHXLMy~=l=~W-l^D;QNha# z4zuXbtU!sIAf!6xj8hPZ@uSi~-n>hBV$o5)`EDPWv{>fN5P5#Umh=j?9WCe0#YaWh ze6+Et@U&b+_4gK|E%i*sBa90tqn5xZ)`Xl{Npw;$N0!YbM5$oR3+q|CEM3^%V@<+p zb>jA=u!g4}7(%#7!@fK#QQf0>>xMpD_u)2?D4G-kz|uc5S-Lfk8N-vf^MX`H_l#;o z^Uppu9x7$_$_(ah$QJwaxS;y|xmtl-CTc85@j=2;Y7>R9Fl(XQ&bzBKiO{Q{%1Kn` z2rLdSRdx>{1~n@Wmh$|I>ml9@0g{d;B3Q<^w(V^ZfDB+J@WW}}C>6*#)%5QZ!;ZHn z@a3B0-0|5?T-8qK79niga8gNm85t^_?9Zyk=JoUSAICYre;n7Im&llIk=*s^P8O{_ zE)pF(gd*EKELfh-f_2%P-#?aFBa)atD1oqZoKSKqs%>t5-B!Tdzp`1kqX2B4It?Gc zTwgr1+`-_!F(icQSup<)L>n1CC?2Ik!Pc~L9N`8&Tbspm7k37Onz%><@u50i`0Xg~ ze6yEooeH`}3MWs~yS`b7(Ee7TElWTx-U04E@dMfFreBhoAD$S_oZpV};g`E1HmKne zW)i~6RbpezsARIs?BwNJaXGzU(l9DDjGmDOUbvwzJC2qy{msqPcmupd3P}(_me|1S zCpbBnX?k(2>V1RJ`eD(|0zUcUI2M-|3atF`(PWApULN{#5Bakv@!j8fTzls-=o%rG z%cc!Jvw^$Y@=RwU007H?Np*kOJ@o7ziPz=h(3U(%2^Oi{4H+zy5^`o07ftQNq6dU+ z{p(d31evvDR5)3@Asd_1!|wNl;U(hU<&@`G1VeUR>jRgr2^5J?N@!z)IIm+ELsG-& zpAtg1_#oOx8PPT#CDS0>ZXd@>?HtOtuq&&IE$NkPK30ySutq4aAv#gCqK>%9BiP1I zs4F0Q{TPiJ`X-rqe`ZfIs+=rbmBGBd#UfTRRF9-qAZJu^({;W1{Kh``{W4`%7lWQ% zM|Q3isd?h@P0EjG8!KYTM-FgGoy(YMJzjy;GBT)B7_a`GCYF%KYWqroA`uRcD75JE3CC5imgsOjDUn9v zL-j-jYY8=|(W({bG)febgxl-K=JHZy^H5@Okze5;tISSOxdW=5!n>(aiWF^05>YoQ zWnH9`QmLRztcmnu8!n%WY!9sQRW6K4!7RLMAReEeOFrC=JG~qdgF!8*_(6F3;uFp6 zcwrQCH|6s74+kiDSa`S$z1PpD zn{#m=E`w?(i+`NKv2q6wKCn_Kj@tjMF^V7%ASp&2GDx*$)jfW(opc3U z)HQBFc2PTJ*QQWAyu#b2SA$9t!lPA*&Q?gmPEl?Te6Oe<={^~?N@CWC6qf8Mq#)l) zVp1@rx=5X_`%gBnk@ODK%B9=^u=zX0eCRJG>4 zpNiHPf*OMx_z}2`R|VR)gKktg-Fcez5c;e#H~ti{BPlMuM6x z`&tI{2TEJtT_@vg%mB5BN2DA#T`tt)qi4HNluC)+8*{}7w7Kb+5=z?aNvu0m%59(S z#HCV@l~XNz^cb3*A;k@ zt!}OvnamTHbfxPF#jI}odM^W$gPAcno}y|OPyDo>-!|nT8`Xi4=_Nc&&wV43xbA{f zl0tP{IcGcbeow2f~MM1X1=ir?~@Lg0sntkdG)wdc3g%WLZWosNuQkUD);9C_Z}pe8{)b zw|5L_vnMg^#SM(UZzV_bEo5a?i83xH8i6H1qr_R^V8rX2aC`lDbShCXB)1w=5)V&G z<>G#^Tz_F_D6oqAmOJRyIf8HR8BEs%GoP-@qAWlO_sOi@+%!6c5QCa7u_hMYKNNF_ zR+N1Qu)7(U8p^;PQRJ1|`DJ?n^S<9-Uylc&m$8?BrB~>mi z=pMt6>5Rz7Pvd=@M5Sp{o3o0c!n{o(iAI7`Ok6|gSVfe^o za_k=R^R1|KDjXg^>vjeTT6+DcloAh46?ysLCJoVMEsB6nQCQ{V&EJl4_ZPeQY*Q|I zR=40fkR&9%n*0(QU$4pJhB57VdwDv?Gb_QMt}oM~RN(RWNK3E4fPnjgK@n9)9 zeSE**FmkA#iwDHfu2VPf?O7vygQMN<>W~wGv6M!kTC0lZ`oCH7tpw zaD83p1N^qTi2L5$Olhf|;z|dyUIj?t^dM!FaibVvdddq-nDB}KbeqM0@MR&w(!q9Um*W6-JyHfyolJV-`0-UmB z62YKukqk)Z+NPh8y%IV>n(J3T{8(6yJ82x%iF}`;U>-Lqf<9H=6{&ti_ z%hEZVXB8X;&FcUkA{6X%lEQdqwauHy1HgVxOgB?VNa1>3`(`h1ugoAh%1C;l70T@F z+F2+HHJU`gDKf(U?e+8Jt7DiN;Msd`&2iTJl}&|4$-pQhZ)+6XH=zSnZZAi+m2utJ zc2w39Rx1KqL${X?ZtjPjBak;o6113!^QJWem^8I__Sbd(V(#w4nAp1A)lu`y+I3O5W* z1i<6-^Xt|;j-{1Tex!`_q8iM4HS>2AFd#XEh?EdUzqX0~cQ41~lSSmRMhRLKz3yGX zt4ogIYha7@##P->=v9IsTcw~Xry5BqF|kLK;P&zPg`+1hTL-C>q;v`w0#)0Qf#}_C zaVDOh-i7IR4a8C7V&|>`B%@joUbL*B)?tLQcTPJW{uu!P(fPd)Hfunxze4wMK}Y`&ETF7M7QBa?{_(a}34gpA@E3J;V(w5dKzCJ<7c z{Z|h2cjTYexUV+la{KJ<$R;h4Qc+iRbk5Ra^h*w*U%yy7N1M2GQYr_ss+jTeUwpqY zo9Y@ja~B;Egp+}0OQCueY%kzoz6F=d$BG?=5N>D<@zuu&1JCZ3o^U2On|6SfViF=r zu|*jcvfYD8r@}h-VgR()EW}+{!{{;Xct`p zZaTv|MR5LoE9&hH1kQ7Kgwe^M7WorR(94{FY()J2l9s%evxRf512lx?2r{ZyfQOnp zSTbp-scga$FEE zE;<4Z@5zOweSWdzoS3B9eCNLlJWfmMH=SktTNIfdL<)LePE9{M6@D2h+`x{V1#I0W z3Q9QJ8@HfVD0fra?2fj^V%jxr6KfyNg@D+|6~5 z{ZW?@oLBA;oz~D!%pcGpf;2)Y)vHO2GP13(hS9HWB&Wh5ESYVuFtQ4fNKM8ib-H%ed?w@cOxRY{E5fc zvXqbz41T$;aMXZyp~0Gzu59T6wY#&@h$*pV9ye+rN!-X$d?Nq#|l zno6si8s`b*k*&iaU>zbh?@t63+y5E-Ulf2-(G{UU4nS-xyCJAhn?|4>GHyTUlr4$8 z1u?=8A!erSz_!5O|7Y?4f&iQf6OamYKup6)h}eWEAOr{k41gA>HO%`E`)~(fMJzL= qh`764M374cA|b~5&pgIIgZ~fAz}=9YS3m*)0000GP)Px)Gf6~2R9Hvtmu+kmRTPHbGuxI{v656sEU>d+0V(XxG%5ihfDtV*F_0j{fFPY& zh|xqL5eN#AkYJFgpivW{v)iO75)xFRv0}sz5|9|^&eE2s5O%jk(C}dpp|(5s$V|82 z-JQ|?@dx{F=Dzcu=bn4+xpxU3el5#Y)sire!81WrMu6Y`jDfhs*b7jNKT`jz2dkVC z$~AgnX=p@ifwY}~#jb%EJBkY1Hja3&>6)uHiy$jZLRTt?=`#>Yoh&e}65(TF{(&J* z`yg2sP{|;T2*Wd(N)lNMc8v7mg~jic1;^GzQEk&?@H0AD+Bo8z;l+BM^9s2_XW8%0_Hl zXTYQu9Ltc7643~N8)d_sJZPAdroP04EdXE16P7YE+R%JOZ4^X1(VX0 z%}lfrj018cHqWUOT|G?@8~jH6BR7!l`Ux##k}C6AY#tej|75>+HU;}WcWM#%UN&O0 za>67uEd2Yb*Up>N)O{d4!QgrbelZY@AL<0^f=O!XHW1ciy6ty?NNl#3 zY&hoN^K!&|-itn=D+YnIZY}RE8qyxNC*!~*HFXmRuVe&gScpY|X#9kmd8$gOWQpp) z%#g$bUXOvKt}JC>F@ff0VtgtavH8@zJQx%{Up$kMJ%LEf{ZIs8cWO~w@-slAI<_!3 z_#>v>nb~a;UG-C?tb|1G+s`C0pOTug8$?T(VFn^G)w7YNYz5J}KKfO%5qrz4N5`rt zdqK2_!F6Q!5dil<@KQNy?)GAIP76&)Luv%U*IUomgw;N7Oij}TFFv-WB^;V+v2@hQ zPEu2^gHS{eL9ZumLQ{_rVcI|e8N5GWmZS3c_qE(`14`+kCmGTnF#ly|W)%qAoee?h@<4UNscZ%bUH!n*6|`e}ZIcbNZ-Mu+ zzOdro67h^eqiv+Cj8?jIN0yT%#*@E$n+f2L08CD*|q|Sq~pP#Nw zv4C0vjR$Z&zpZUz1|~QbkiNZnX&T)zDf|L(9YB}!iK3-OeR3d(gr>%B-iwuvZ}^}b zF)IhsWp0Smow^|0F2D~HsG?iT%Vfi>?K%#eLQ1FKwR=uaL$bt7e@*=GpkQ?6HGtOk z_u$5xH_8`eBmT7m+E;MCs$zIMi3%oC!MH8Iy)9B&+mspw4v00000NkvXX Hu0mjfWu%NO literal 0 HcmV?d00001 diff --git a/Resources/upload-to-server-01.png b/Resources/upload-to-server-01.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f9456ce20e766bbf5b1c05e01be06d682e6b47 GIT binary patch literal 3609 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 Q1!hGCPgg&ebxsLQ092i&VE_OC literal 0 HcmV?d00001 diff --git a/domain/ComboboxItem.cs b/domain/ComboboxItem.cs new file mode 100644 index 0000000..9d15a9c --- /dev/null +++ b/domain/ComboboxItem.cs @@ -0,0 +1,19 @@ +namespace FileProcessClient.domain +{ + internal class ComboboxItem + { + public string Text { get; set; } + public object Value { get; set; } + + public override string ToString() + { + return Text; + } + + public ComboboxItem(string text, object value) + { + Text = text; + Value = value; + } + } +} diff --git a/domain/DeviceInfo.cs b/domain/DeviceInfo.cs new file mode 100644 index 0000000..e9598ca --- /dev/null +++ b/domain/DeviceInfo.cs @@ -0,0 +1,17 @@ +namespace FileProcessClient.domain +{ + internal class DeviceInfo + { + private long _id; + private string _name=""; + private string _duid=""; + private double _lon; + private double _lat; + + public long Id { get { return _id; } set { _id = value; } } + public string Name { get { return _name; } set { _name = value; } } + public double Lon { get { return _lon; } set { _lon = value; } } + public double Lat { get { return _lat; } set { _lat = value; } } + public string Duid { get { return _duid; } set { _duid = value; } } + } +} diff --git a/domain/MediaFileInfo.cs b/domain/MediaFileInfo.cs new file mode 100644 index 0000000..98aae6c --- /dev/null +++ b/domain/MediaFileInfo.cs @@ -0,0 +1,44 @@ +using Microsoft.VisualBasic; +using static System.Runtime.InteropServices.JavaScript.JSType; +using System.Xml.Linq; + +namespace FileProcessClient.domain +{ + internal class MediaFileInfo + { + + private int _uploadType; + + private string _deviceId; + + private string _deviceName; + + //private long userId; + + private string _version; + + private int _versionId; + + private string _remotePath; + + private List _ileItems; + public int uploadType { get { return _uploadType; } set { _uploadType = value; } } + + public string deviceId { get { return _deviceId; } set { _deviceId = value; } } + + //public long UserId { get { return userId; } set { userId = value; } } + + public string version { get { return _version; } set { _version = value; } } + + public int versionId { get { return _versionId; } set { _versionId = value; } } + + public string remotePath { get { return _remotePath; } set { _remotePath = value; } } + + + public string deviceName { get { return _deviceName; } set { _deviceName = value; } } + + public List fileItems { get { return _ileItems; } set { _ileItems = value; } } + + + } +} diff --git a/domain/MediaFileItem.cs b/domain/MediaFileItem.cs new file mode 100644 index 0000000..32717bb --- /dev/null +++ b/domain/MediaFileItem.cs @@ -0,0 +1,25 @@ +namespace FileProcessClient.domain +{ + internal class MediaFileItem + { + private string _fileName; + + //private string _fileType; + + private string _urlPath; + + private string _metaPath; + + private string _time; + + public string fileName { get { return _fileName; } set { _fileName = value; } } + + //public string fileType { get { return _fileType; } set { _fileType = value; } } + + public string urlPath { get { return _urlPath; } set { _urlPath = value; } } + + public string metaPath { get { return _metaPath; } set { _metaPath = value; } } + + public string time { get { return _time; } set { _time = value; } } + } +} diff --git a/domain/User.cs b/domain/User.cs new file mode 100644 index 0000000..d3b5644 --- /dev/null +++ b/domain/User.cs @@ -0,0 +1,28 @@ +namespace FileProcessClient.domain +{ + internal class User + { + private int id; + private string name = ""; + private string loginId = ""; + private string phone = ""; + private int deptId; + + + public int Id { get { return id; } set { id = value; } } + public string Name { get { return name; } set { name = value; } } + public string LoginId { get { return loginId; } set { loginId = value; } } + public string Phone { get { return phone; } set { phone = value; } } + + public int DeptId { get { return deptId; } set { deptId = value; } } + + public User(int id, string name, string loginId, string phone, int deptId) + { + Id = id; + Name = name; + LoginId = loginId; + Phone = phone; + DeptId = deptId; + } + } +} diff --git a/utils/CommonUtils.cs b/utils/CommonUtils.cs new file mode 100644 index 0000000..c9fd1fe --- /dev/null +++ b/utils/CommonUtils.cs @@ -0,0 +1,218 @@ +using FileProcessClient.domain; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Text; +using System.Xml.Linq; + +namespace edu.huvtc.utils +{ + internal class CommonUtils + { + [DllImport("kernel32")] + private static extern long WritePrivateProfileString(string name, string key, string val, + string filePath); + [DllImport("kernel32")] + private static extern int GetPrivateProfileString(string section, string key, string def, + StringBuilder retVal, int size, + string filePath); + + private const int AesBlockByteSize = 128 / 8; + + private const int PasswordSaltByteSize = 128 / 8; + + private const int PasswordByteSize = 256 / 8; + + private const int PasswordIterationCount = 100_000; + + private static readonly Encoding StringEncoding = Encoding.UTF8; + + private static readonly RandomNumberGenerator Random = RandomNumberGenerator.Create(); + + private static String password = "from huvtc passwords 123412;,[p;[; 172634812"; + + private static string INIPath = Convert.ToString(System.AppDomain.CurrentDomain.BaseDirectory) + "Config.ini"; + + private static string Token = ""; + + private static string serverUrl = ""; + + private static User user; + + public static User getUser() + { + return user; + } + + public static void setUser(User data) + { + user = data; + } + + + public static void setToken(string token) + { + writeToIni("security", "token", token); + Token = token; + } + + public static string getToken() + { + if (Token == null || Token == "") + { + Token = readFromFile("security", "token"); + } + return Token; + } + + public static void writeToIni(string name, string key, string value) + { + WritePrivateProfileString(name, key, value, INIPath); + } + + public static string readFromFile(string name, string key) + { + StringBuilder builder = new StringBuilder(255); + int ini = GetPrivateProfileString(name, key, "", builder, 255, INIPath); + return builder.ToString(); + } + + + public static byte[] EncryptString(string toEncrypt) + { + using (var aes = Aes.Create()) + { + var keySalt = GenerateRandomBytes(PasswordSaltByteSize); + var key = GetKey(keySalt); + var iv = GenerateRandomBytes(AesBlockByteSize); + + using (var encryptor = aes.CreateEncryptor(key, iv)) + { + var plainText = StringEncoding.GetBytes(toEncrypt); + var cipherText = encryptor + .TransformFinalBlock(plainText, 0, plainText.Length); + + var result = MergeArrays(keySalt, iv, cipherText); + return result; + } + } + } + + + public static string DecryptToString(byte[] encryptedData) + { + using (var aes = Aes.Create()) + { + var keySalt = encryptedData.Take(PasswordSaltByteSize).ToArray(); + var key = GetKey(keySalt); + var iv = encryptedData + .Skip(PasswordSaltByteSize).Take(AesBlockByteSize).ToArray(); + var cipherText = encryptedData + .Skip(PasswordSaltByteSize + AesBlockByteSize).ToArray(); + + using (var encryptor = aes.CreateDecryptor(key, iv)) + { + var decryptedBytes = encryptor + .TransformFinalBlock(cipherText, 0, cipherText.Length); + return StringEncoding.GetString(decryptedBytes); + } + } + } + + private static byte[] GetKey(byte[] passwordSalt) + { + var keyBytes = StringEncoding.GetBytes(password); + + using (var derivator = new Rfc2898DeriveBytes( + keyBytes, passwordSalt, + PasswordIterationCount, HashAlgorithmName.SHA256)) + { + return derivator.GetBytes(PasswordByteSize); + } + } + + private static byte[] GenerateRandomBytes(int numberOfBytes) + { + var randomBytes = new byte[numberOfBytes]; + Random.GetBytes(randomBytes); + return randomBytes; + } + + private static byte[] MergeArrays(params byte[][] arrays) + { + var merged = new byte[arrays.Sum(a => a.Length)]; + var mergeIndex = 0; + for (int i = 0; i < arrays.GetLength(0); i++) + { + arrays[i].CopyTo(merged, mergeIndex); + mergeIndex += arrays[i].Length; + } + + return merged; + } + + public static string getServerUrl() + { + if (serverUrl == null || serverUrl.Length == 0) + { + serverUrl = readFromFile("common", "server_url"); + } + return serverUrl; + } + + public static string getTokenFormIni() + { + return readFromFile("security", "token"); + } + + public static void savePassword(string username, string password) + { + username = Convert.ToBase64String(CommonUtils.EncryptString(username)); + + password = Convert.ToBase64String(CommonUtils.EncryptString(password)); + + writeToIni("userData", "userName", username); + + writeToIni("userData", "password", password); + } + + public static string getApiUrl(string name) + { + return readFromFile("ApiUrls", name); + + } + + public static string getFtpServer() + { + return readFromFile("ftp_server", "server_ip"); + } + + public static string getFtpUsr() + { + return getDecryptValue("ftp_server", "ftp_user"); + } + + public static string getFtpPassword() + { + return getDecryptValue("ftp_server", "ftp_password"); + + } + + private static string getDecryptValue(string name, string item) + { + string str = readFromFile(name, item); + if (str == null) + { + return ""; + } + else + { + return DecryptToString(Convert.FromBase64String(str)); + } + } + + public static int getFtpServerPort() + { + return int.Parse(readFromFile("ftp_server", "server_port")); + } + } +} diff --git a/utils/FileUploadUtils.cs b/utils/FileUploadUtils.cs new file mode 100644 index 0000000..a28054b --- /dev/null +++ b/utils/FileUploadUtils.cs @@ -0,0 +1,163 @@ +using edu.huvtc.utils; +using FileProcessClient.domain; +using FluentFTP; +using System.Diagnostics; + +namespace FileProcessClient.utils +{ + internal class FileUploadUtils + { + public static async Task UploadFileAsync(string localPath, string remoteFilePath, Action callback) + { + var token = new CancellationToken(); + using (var conn = new AsyncFtpClient(CommonUtils.getFtpServer(), CommonUtils.getFtpUsr(), CommonUtils.getFtpPassword(), CommonUtils.getFtpServerPort(), config: new FtpConfig + { + DataConnectionType = FtpDataConnectionType.PORT + })) + { + try + { + await conn.Connect(token); + Progress progress = new Progress(p => + { + callback((int)(p.Progress)); + //Trace.WriteLine(p.Progress); + }); + await conn.UploadFile(localPath, remoteFilePath, FtpRemoteExists.Overwrite, false, FtpVerify.None, progress, token); + } + catch (Exception ex) + { + callback(-1); + //Trace.WriteLine(ex.ToString()); + } + finally + { + await conn.Disconnect(); + } + } + } + + + public static async Task UploadFilesAsync(List list, string remoteRootPath, Action callback) + { + var token = new CancellationToken(); + using (var conn = new AsyncFtpClient(CommonUtils.getFtpServer(), CommonUtils.getFtpUsr(), CommonUtils.getFtpPassword(), CommonUtils.getFtpServerPort(), config: new FtpConfig + { + DataConnectionType = FtpDataConnectionType.PASV, + ConnectTimeout = 60000, + ReadTimeout = 60000 + })) + { + int index = 0; + try + { + await conn.Connect(token); + + //conn.AutoDetect(FtpDataConnectionType.PORT); + Progress progress = new Progress(p => + { + //Trace.WriteLine(p.Progress); + callback(index, (int)(p.Progress)); + + }); + + bool pathExits = await conn.DirectoryExists(remoteRootPath + "/json", token); + if (!pathExits) + { + await conn.CreateDirectory(remoteRootPath + "/json", true, token); + } + + pathExits = await conn.DirectoryExists(remoteRootPath + "/media", token); + if (!pathExits) + { + await conn.CreateDirectory(remoteRootPath + "/media", true, token); + } + + foreach (MediaFileItem file in list) + { + //Trace.WriteLine(file.fileName); + //Trace.WriteLine(file.urlPath); + await conn.UploadFile(file.fileName, file.urlPath, FtpRemoteExists.Overwrite, false, FtpVerify.None, progress, token); + index++; + } + return true; + } + catch (Exception ex) + { + callback(index, -1); + Trace.WriteLine(ex.ToString()); + //return false; + } + finally + { + await conn.Disconnect(); + } + return false; + } + } + + public static async Task UploadFilesAsync(List localFiles, string remoteRootPath, Action callback) + { + var token = new CancellationToken(); + using (var conn = new AsyncFtpClient(CommonUtils.getFtpServer(), CommonUtils.getFtpUsr(), CommonUtils.getFtpPassword(), CommonUtils.getFtpServerPort(), config: new FtpConfig + { + DataConnectionType = FtpDataConnectionType.PORT + })) + { + int index = 0; + try + { + await conn.Connect(token); + Progress progress = new Progress(p => + { + callback(index, (int)(p.Progress)); + + }); + bool pathExits = await conn.DirectoryExists(remoteRootPath, token); + if (!pathExits) + { + await conn.CreateDirectory(remoteRootPath, true, token); + } + foreach (var file in localFiles) + { + //Trace.WriteLine(file); + //Trace.WriteLine(remoteRootPath + "/" + getFileName(file)); + await conn.UploadFile(file, remoteRootPath + "/" + getFileName(file), FtpRemoteExists.Overwrite, false, FtpVerify.None, progress, token); + index++; + } + return true; + + } + catch (Exception ex) + { + callback(index, -1); + return false; + //Trace.WriteLine(ex.ToString()); + } + finally + { + await conn.Disconnect(); + } + } + } + + public static string getFileName(string fullPath) + { + string[] arr = fullPath.Split(Path.DirectorySeparatorChar); + return arr[arr.Length - 1]; + } + + public static string getFileExt(string fullPath) + { + string[] arr = fullPath.Split("\\."); + return arr[arr.Length - 1]; + } + + + public static string getFileCreateDataTime(string filePath) + { + FileInfo fileInfo = new FileInfo(filePath); + return fileInfo.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + } +} diff --git a/utils/HttpUtils.cs b/utils/HttpUtils.cs new file mode 100644 index 0000000..d9a25b2 --- /dev/null +++ b/utils/HttpUtils.cs @@ -0,0 +1,247 @@ +using FileProcessClient.domain; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Diagnostics; +using System.Net; +using System.Net.Http.Headers; +using System.Text.Json.Nodes; + +namespace edu.huvtc.utils +{ + internal class HttpUtils + { + + public static async Task HttpClientPost(string url, string data) + { + string token = CommonUtils.getToken(); + + var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.None }; + + handler.ServerCertificateCustomValidationCallback = (message, cert, chain, error) => true; + + string serverUrl = CommonUtils.getServerUrl(); + + using (var httpclient = new HttpClient(handler)) + { + try + { + httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); + + httpclient.BaseAddress = new Uri(serverUrl + url); + + HttpContent content = new StringContent(data, System.Text.Encoding.UTF8, "application/json"); + + content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); + + var response = await httpclient.PostAsync(url, content); + + string responseString = await response.Content.ReadAsStringAsync(); + + //Trace.WriteLine(responseString); + + return responseString; + } + catch (HttpRequestException e) + { + // 捕获 HttpRequestException 异常以处理网络错误 + //Console.WriteLine($"请求异常: {e.Message}"); + MessageBox.Show("网络异常,请确认是否联网!"); + return ""; + } + catch (TaskCanceledException e) + { + MessageBox.Show("请求超时!"); + return ""; + } + catch (Exception e) + { + // 捕获其他异常 + //Console.WriteLine($"其他异常: {e.Message}"); + MessageBox.Show("发生未知错误"); + return "503"; + } + } + + } + + public static async Task HttpClientGet(string url, string query) + { + string token = CommonUtils.getToken(); + + url = CommonUtils.getServerUrl() + url; + + Trace.WriteLine(url); + + using (HttpClient client = new HttpClient()) + { + try + { + client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); + + var builder = new UriBuilder(url); + + //var query = System.Web.HttpUtility.ParseQueryString(builder.Query); + //query["param1"] = "value1"; + //query["param2"] = "value2"; + + builder.Query = query; + + string str_url = builder.ToString(); + + HttpResponseMessage response = await client.GetAsync(str_url); + + + return await response.Content.ReadAsStringAsync(); + } + catch (HttpRequestException e) + { + // 捕获 HttpRequestException 异常以处理网络错误 + //Console.WriteLine($"请求异常: {e.Message}"); + MessageBox.Show("网络或服务器异常!"); + return ""; + } + catch (TaskCanceledException e) + { + MessageBox.Show("请求超时!"); + return ""; + } + catch (Exception e) + { + // 捕获其他异常 + //Console.WriteLine($"其他异常: {e.Message}"); + MessageBox.Show("发生未知错误"); + return ""; + } + + } + + } + + public static async Task getUserInfo() + { + string token = CommonUtils.getToken(); + //Trace.WriteLine(token); + if (token != null && token != "") + { + string url = CommonUtils.getApiUrl("user_info_url"); + string result = await HttpUtils.HttpClientGet(url, ""); + + //Trace.WriteLine(result); + if (result == "") + { + return false; + } + JObject jsonObject = JObject.Parse(result); + int code = (int)jsonObject["code"]!; + if (code != 200) + { + return false; + } + else + { + string strUser = jsonObject["user"]!.ToString(); + + //Trace.WriteLine(strUser); + + JObject obj = JObject.Parse(strUser); + int id = (int)obj["userId"]!; + string loginId = (string)obj["userName"]!; + string phone = (string)obj["phonenumber"]!; + string name = (string)obj["nickName"]!; + int deptId = (int)obj["deptId"]!; + User user = new User(id, name, loginId, phone, deptId); + CommonUtils.setUser(user); + return true; + } + } + else + { + return false; + } + } + + public static async Task saveMediaFileInfo(MediaFileInfo mediaFileInfo) + { + var jsonString = JsonConvert.SerializeObject(mediaFileInfo); + //Trace.WriteLine(jsonString); + string url = CommonUtils.getApiUrl("save_media_file_url"); + string res = await HttpClientPost(url, jsonString); + if (res == "") + { + return false; + } + return true; + } + + public static async Task> getVersionList() + { + string url = CommonUtils.getApiUrl("file_version_list_url"); + + string res = await HttpUtils.HttpClientGet(url, ""); + //Trace.WriteLine(res); + if (res == null) + { + return new List(); + } + + List list = new List(); + JArray array = JArray.Parse(res); + + foreach (var item in array) + { + list.Add(new ComboboxItem(item["dictLabel"]!.ToString(), item["dictCode"]!.ToString())); + } + + return list; + } + + public static async Task> getCameraList() + { + string url = CommonUtils.getApiUrl("camera_list_url"); + + string res = await HttpUtils.HttpClientGet(url, ""); + if (res == null) + { + return new List(); + } + + List list = new List(); + + JArray array = JArray.Parse(res); + + foreach (var item in array) + { + list.Add(new ComboboxItem(item["duid"]!.ToString(), item["id"]!.ToString())); + } + + return list; + } + + public static async Task validateLogin(string username, string password) + { + JsonObject obj = new JsonObject(); + obj.Add("username", username); + obj.Add("password", password); + obj.Add("loginType", 1); + string result = await HttpUtils.HttpClientPost("/login", obj.ToString()); + Trace.WriteLine("==================="+result); + if (result == "") + { + return false; + } + JObject jsonObject = JObject.Parse(result); + + int code = (int)jsonObject["code"]!; + if (code == 200) + { + string token = (string)jsonObject["token"]!; + CommonUtils.setToken(token); + return true; + } + else + { + return false; + } + } + } +}