refactor: OWIN 웹서버 제거, WebView2 VirtualHost 방식으로 전환

- OWIN 관련 패키지 제거 (Microsoft.Owin.*, Microsoft.AspNet.WebApi.*)
- 모든 Web API 컨트롤러 삭제 (Controllers/*.cs)
- Startup.cs 삭제
- 기존 WebView2 Dialog 삭제 (fDashboard, fHolyday, fJobReport, fLogin_WB, fCommon)
- fDashboardNew만 유지 (SetVirtualHostNameToFolderMapping 방식)
- fMain.cs에서 OWIN 서버 시작 코드 제거
- 품목검색/설명서 메뉴 수정 (로컬 파일 참조로 변경)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
backuppc
2025-11-25 17:30:08 +09:00
parent 44af041d1a
commit 8a0a4ccc4c
36 changed files with 16 additions and 7324 deletions

View File

@@ -1,46 +0,0 @@
namespace Project.Dialog
{
partial class fCommon
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// fHolyday
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1063, 567);
this.Name = "fHolyday";
this.Text = "근태입력";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@@ -1,87 +0,0 @@
using FCM0000.Mail;
using FCOMMON;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Project.Dialog
{
public partial class fCommon : fBase
{
private WebView2 webView21;
public fCommon()
{
InitializeComponent();
this.Text = "공용코드 관리";
this.Size = new Size(1000, 900);
InitializeWebView2();
}
private void InitializeWebView2()
{
// 수동으로 WebView2 컨트롤 생성
this.webView21 = new WebView2();
// 기본 속성 설정
this.webView21.CreationProperties = null;
this.webView21.DefaultBackgroundColor = Color.White;
this.webView21.Dock = DockStyle.Fill;
this.webView21.Location = new Point(0, 0);
this.webView21.Name = "webView21";
this.webView21.Size = new Size(800, 600);
this.webView21.TabIndex = 0;
this.webView21.ZoomFactor = 1D;
// 폼에 추가
this.Controls.Add(this.webView21);
// 비동기 초기화
InitializeAsync();
}
private async void InitializeAsync()
{
try
{
// Fixed Version 경로 설정
string runtimePath = Path.Combine(Application.StartupPath, "WebView2Runtime");
if (Directory.Exists(runtimePath))
{
var env = await CoreWebView2Environment.CreateAsync(runtimePath);
await this.webView21.EnsureCoreWebView2Async(env);
}
else
{
// 시스템에 설치된 WebView2 사용
await this.webView21.EnsureCoreWebView2Async();
}
// OWIN 서버의 DashBoard 페이지로 연결
webView21.Source = new Uri($"{Pub.WebServiceURL}/Common");
}
catch (Exception ex)
{
MessageBox.Show($"WebView2 초기화 실패: {ex.Message}");
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureVisibleAndUsableSize();
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,63 +0,0 @@
namespace Project.Dialog
{
partial class fDashboard
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Font = new System.Drawing.Font("맑은 고딕", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(129)));
this.label1.ForeColor = System.Drawing.Color.DimGray;
this.label1.Location = new System.Drawing.Point(0, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(1063, 567);
this.label1.TabIndex = 0;
this.label1.Text = "요약 화면 구성 중 입니다.\r\n\r\n업무일지는 \"관리->업무일지->목록\" 을 사용하세요";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label1.Click += new System.EventHandler(this.label1_Click);
//
// fDashboard
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1063, 567);
this.Controls.Add(this.label1);
this.Name = "fDashboard";
this.Text = "요약";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label label1;
}
}

View File

@@ -1,94 +0,0 @@
using FCM0000.Mail;
using FCOMMON;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Project.Dialog
{
public partial class fDashboard : fBase
{
private WebView2 webView21;
public fDashboard()
{
InitializeComponent();
InitializeWebView2();
}
bool loadok = false;
public void RefreshView()
{
if (loadok)
webView21.Reload();
}
private void InitializeWebView2()
{
// 수동으로 WebView2 컨트롤 생성
this.webView21 = new WebView2();
// 기본 속성 설정
this.webView21.CreationProperties = null;
this.webView21.DefaultBackgroundColor = Color.White;
this.webView21.Dock = DockStyle.Fill;
this.webView21.Location = new Point(0, 0);
this.webView21.Name = "webView21";
this.webView21.Size = new Size(800, 600);
this.webView21.TabIndex = 0;
this.webView21.ZoomFactor = 1D;
// 폼에 추가
this.Controls.Add(this.webView21);
// 비동기 초기화
InitializeAsync();
}
private async void InitializeAsync()
{
try
{
// Fixed Version 경로 설정
string runtimePath = Path.Combine(Application.StartupPath, "WebView2Runtime");
if (Directory.Exists(runtimePath))
{
var env = await CoreWebView2Environment.CreateAsync(runtimePath);
await this.webView21.EnsureCoreWebView2Async(env);
}
else
{
// 시스템에 설치된 WebView2 사용
await this.webView21.EnsureCoreWebView2Async();
}
// OWIN 서버의 DashBoard 페이지로 연결
webView21.Source = new Uri($"{Pub.WebServiceURL}/DashBoard");
label1.Visible = false;
loadok = true;
}
catch (Exception ex)
{
MessageBox.Show($"WebView2 초기화 실패: {ex.Message}");
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureVisibleAndUsableSize();
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,46 +0,0 @@
namespace Project.Dialog
{
partial class fHolyday
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// fHolyday
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1063, 567);
this.Name = "fHolyday";
this.Text = "근태입력";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@@ -1,86 +0,0 @@
using FCM0000.Mail;
using FCOMMON;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Project.Dialog
{
public partial class fHolyday : fBase
{
private WebView2 webView21;
public fHolyday()
{
InitializeComponent();
InitializeWebView2();
}
private void InitializeWebView2()
{
// 수동으로 WebView2 컨트롤 생성
this.webView21 = new WebView2();
// 기본 속성 설정
this.webView21.CreationProperties = null;
this.webView21.DefaultBackgroundColor = Color.White;
this.webView21.Dock = DockStyle.Fill;
this.webView21.Location = new Point(0, 0);
this.webView21.Name = "webView21";
this.webView21.Size = new Size(800, 600);
this.webView21.TabIndex = 0;
this.webView21.ZoomFactor = 1D;
// 폼에 추가
this.Controls.Add(this.webView21);
// 비동기 초기화
InitializeAsync();
}
private async void InitializeAsync()
{
try
{
// Fixed Version 경로 설정
string runtimePath = Path.Combine(Application.StartupPath, "WebView2Runtime");
if (Directory.Exists(runtimePath))
{
var env = await CoreWebView2Environment.CreateAsync(runtimePath);
await this.webView21.EnsureCoreWebView2Async(env);
}
else
{
// 시스템에 설치된 WebView2 사용
await this.webView21.EnsureCoreWebView2Async();
}
// OWIN 서버의 DashBoard 페이지로 연결
webView21.Source = new Uri($"{Pub.WebServiceURL}/kuntae");
}
catch (Exception ex)
{
MessageBox.Show($"WebView2 초기화 실패: {ex.Message}");
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureVisibleAndUsableSize();
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,46 +0,0 @@
namespace Project.Dialog
{
partial class fJobReport
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// fJobReport
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1063, 567);
this.Name = "fJobReport";
this.Text = "업무일지";
this.ResumeLayout(false);
}
#endregion
}
}

View File

@@ -1,86 +0,0 @@
using FCM0000.Mail;
using FCOMMON;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Project.Dialog
{
public partial class fJobReport : fBase
{
private WebView2 webView21;
public fJobReport()
{
InitializeComponent();
InitializeWebView2();
}
private void InitializeWebView2()
{
// 수동으로 WebView2 컨트롤 생성
this.webView21 = new WebView2();
// 기본 속성 설정
this.webView21.CreationProperties = null;
this.webView21.DefaultBackgroundColor = Color.White;
this.webView21.Dock = DockStyle.Fill;
this.webView21.Location = new Point(0, 0);
this.webView21.Name = "webView21";
this.webView21.Size = new Size(800, 600);
this.webView21.TabIndex = 0;
this.webView21.ZoomFactor = 1D;
// 폼에 추가
this.Controls.Add(this.webView21);
// 비동기 초기화
InitializeAsync();
}
private async void InitializeAsync()
{
try
{
// Fixed Version 경로 설정
string runtimePath = Path.Combine(Application.StartupPath, "WebView2Runtime");
if (Directory.Exists(runtimePath))
{
var env = await CoreWebView2Environment.CreateAsync(runtimePath);
await this.webView21.EnsureCoreWebView2Async(env);
}
else
{
// 시스템에 설치된 WebView2 사용
await this.webView21.EnsureCoreWebView2Async();
}
// OWIN 서버의 DashBoard 페이지로 연결
webView21.Source = new Uri($"{Pub.WebServiceURL}/Jobreport");
}
catch (Exception ex)
{
MessageBox.Show($"WebView2 초기화 실패: {ex.Message}");
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureVisibleAndUsableSize();
}
private void label1_Click(object sender, EventArgs e)
{
}
}
}

View File

@@ -1,120 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -1,289 +0,0 @@
namespace Project.Dialog
{
partial class fLogin_WB
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(fLogin));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.panel1 = new System.Windows.Forms.Panel();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.listView1 = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.tabPage2 = new System.Windows.Forms.TabPage();
this.linkLabel1 = new System.Windows.Forms.LinkLabel();
this.label4 = new System.Windows.Forms.Label();
this.cmbDept = new System.Windows.Forms.ComboBox();
this.label3 = new System.Windows.Forms.Label();
this.tbID = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.tbPW = new System.Windows.Forms.TextBox();
this.panel2 = new System.Windows.Forms.Panel();
this.btLogin = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.panel1.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.panel2.SuspendLayout();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(405, 25);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(80, 80);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox1.TabIndex = 3;
this.pictureBox1.TabStop = false;
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(245)))), ((int)(((byte)(245)))), ((int)(((byte)(244)))));
this.panel1.Controls.Add(this.tabControl1);
this.panel1.Controls.Add(this.linkLabel1);
this.panel1.Controls.Add(this.label4);
this.panel1.Controls.Add(this.cmbDept);
this.panel1.Controls.Add(this.label3);
this.panel1.Controls.Add(this.tbID);
this.panel1.Controls.Add(this.label2);
this.panel1.Controls.Add(this.label1);
this.panel1.Controls.Add(this.tbPW);
this.panel1.Controls.Add(this.pictureBox1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(888, 639);
this.panel1.TabIndex = 0;
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Location = new System.Drawing.Point(16, 288);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(860, 327);
this.tabControl1.TabIndex = 13;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.listView1);
this.tabPage1.Location = new System.Drawing.Point(4, 32);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(852, 291);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "FAQ";
this.tabPage1.UseVisualStyleBackColor = true;
//
// listView1
//
this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
this.columnHeader1});
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(3, 3);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(846, 285);
this.listView1.TabIndex = 13;
this.listView1.UseCompatibleStateImageBehavior = false;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDoubleClick);
//
// columnHeader1
//
this.columnHeader1.Text = "제목";
this.columnHeader1.Width = 836;
//
// tabPage2
//
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(852, 301);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "PATCH";
this.tabPage2.UseVisualStyleBackColor = true;
//
// linkLabel1
//
this.linkLabel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.linkLabel1.AutoSize = true;
this.linkLabel1.Location = new System.Drawing.Point(806, 110);
this.linkLabel1.Name = "linkLabel1";
this.linkLabel1.Size = new System.Drawing.Size(70, 23);
this.linkLabel1.TabIndex = 11;
this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "신규가입";
this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked);
//
// label4
//
this.label4.AutoSize = true;
this.label4.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.label4.ForeColor = System.Drawing.Color.Teal;
this.label4.Location = new System.Drawing.Point(13, 257);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(243, 15);
this.label4.TabIndex = 10;
this.label4.Text = "문의 ) Chickyun.kim@amkor.co.kr, T.8567";
//
// cmbDept
//
this.cmbDept.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbDept.Font = new System.Drawing.Font("Calibri", 20.25F);
this.cmbDept.FormattingEnabled = true;
this.cmbDept.Location = new System.Drawing.Point(16, 136);
this.cmbDept.Name = "cmbDept";
this.cmbDept.Size = new System.Drawing.Size(860, 41);
this.cmbDept.TabIndex = 9;
this.cmbDept.SelectedIndexChanged += new System.EventHandler(this.cmbDept_SelectedIndexChanged);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label3.ForeColor = System.Drawing.Color.Gray;
this.label3.Location = new System.Drawing.Point(13, 119);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(31, 15);
this.label3.TabIndex = 8;
this.label3.Text = "부서";
//
// tbID
//
this.tbID.Font = new System.Drawing.Font("Calibri", 20.25F);
this.tbID.FormattingEnabled = true;
this.tbID.ImeMode = System.Windows.Forms.ImeMode.Alpha;
this.tbID.Location = new System.Drawing.Point(16, 205);
this.tbID.Name = "tbID";
this.tbID.Size = new System.Drawing.Size(364, 41);
this.tbID.TabIndex = 3;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Font = new System.Drawing.Font("맑은 고딕", 9F);
this.label2.ForeColor = System.Drawing.Color.Gray;
this.label2.Location = new System.Drawing.Point(509, 187);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(31, 15);
this.label2.TabIndex = 4;
this.label2.Text = "암호";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("맑은 고딕", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.ForeColor = System.Drawing.Color.Gray;
this.label1.Location = new System.Drawing.Point(13, 188);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(55, 15);
this.label1.TabIndex = 2;
this.label1.Text = "사원번호";
//
// tbPW
//
this.tbPW.Font = new System.Drawing.Font("Calibri", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tbPW.ImeMode = System.Windows.Forms.ImeMode.Alpha;
this.tbPW.Location = new System.Drawing.Point(512, 205);
this.tbPW.Name = "tbPW";
this.tbPW.PasswordChar = '●';
this.tbPW.Size = new System.Drawing.Size(364, 40);
this.tbPW.TabIndex = 5;
this.tbPW.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
//
// panel2
//
this.panel2.BackColor = System.Drawing.SystemColors.Control;
this.panel2.Controls.Add(this.btLogin);
this.panel2.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel2.Location = new System.Drawing.Point(0, 639);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(888, 82);
this.panel2.TabIndex = 6;
//
// btLogin
//
this.btLogin.Dock = System.Windows.Forms.DockStyle.Fill;
this.btLogin.Font = new System.Drawing.Font("맑은 고딕", 25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btLogin.Location = new System.Drawing.Point(0, 0);
this.btLogin.Name = "btLogin";
this.btLogin.Size = new System.Drawing.Size(888, 82);
this.btLogin.TabIndex = 0;
this.btLogin.Text = "접속";
this.btLogin.UseVisualStyleBackColor = true;
this.btLogin.Click += new System.EventHandler(this.button1_Click);
//
// fLogin
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.Color.OrangeRed;
this.ClientSize = new System.Drawing.Size(888, 721);
this.Controls.Add(this.panel1);
this.Controls.Add(this.panel2);
this.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "fLogin";
this.Text = "사용자확인";
this.Load += new System.EventHandler(this.fLogin_Load);
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Button btLogin;
public System.Windows.Forms.TextBox tbPW;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ComboBox tbID;
private System.Windows.Forms.ComboBox cmbDept;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.LinkLabel linkLabel1;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.ListView listView1;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.TabPage tabPage2;
}
}

View File

@@ -1,491 +0,0 @@
using FCOMMON;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Windows.Forms;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System.IO;
namespace Project.Dialog
{
public partial class fLogin_WB : fBase
{
private WebView2 webView21;
public fLogin_WB()
{
InitializeComponent();
InitializeWebView2();
this.tbID.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Enter) tbPW.Focus(); };
this.tbPW.KeyDown += (s1, e1) => { if (e1.KeyCode == Keys.Enter) btLogin.PerformClick(); };
this.KeyPreview = true;
this.KeyDown += (s1, e1) =>
{
if (e1.KeyCode == Keys.Escape) this.Close();
};
this.Text = string.Format("사용자 확인(v{0})", Application.ProductVersion);
var lv = this.listView1.Items.Add("[25-04-06] 데이터베이스 이전 작업 완료 (버그신고:chikyun.kim@amkor.co.kr)");
lv.Tag = "기존 데이터베이스 삭제 예정으로 인한 신규 데이터베이스 업데이트 작업 완료\n일부 기능에 문제가 발생할 수 있습니다. 문제 발생시에는 chikyun.kim@amkor.co.kr 로 문의 주세요";
}
private void InitializeWebView2()
{
// 수동으로 WebView2 컨트롤 생성
this.webView21 = new WebView2();
// 기본 속성 설정
this.webView21.CreationProperties = null;
this.webView21.DefaultBackgroundColor = Color.White;
this.webView21.Dock = DockStyle.Fill;
this.webView21.Location = new Point(0, 0);
this.webView21.Name = "webView21";
this.webView21.Size = new Size(800, 600);
this.webView21.TabIndex = 0;
this.webView21.ZoomFactor = 1D;
// 폼에 추가
this.Controls.Clear();
this.Controls.Add(this.webView21);
// 비동기 초기화
InitializeAsync();
}
private async void InitializeAsync()
{
try
{
// Fixed Version 경로 설정
string runtimePath = Path.Combine(Application.StartupPath, "WebView2Runtime");
if (Directory.Exists(runtimePath))
{
var env = await CoreWebView2Environment.CreateAsync(runtimePath);
await this.webView21.EnsureCoreWebView2Async(env);
}
else
{
// 시스템에 설치된 WebView2 사용
await this.webView21.EnsureCoreWebView2Async();
}
// WebView2에서 C# 메서드를 호출할 수 있도록 설정
webView21.CoreWebView2.WebMessageReceived += WebView2_WebMessageReceived;
//var wwwroot = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "web", "wwwroot");
//var mapnme = $"gw{DateTime.Now.ToString("mmssfff")}.local";
//webView21.CoreWebView2.SetVirtualHostNameToFolderMapping(mapnme, wwwroot, CoreWebView2HostResourceAccessKind.Allow);
//Pub.WebServiceURL = $"http://{mapnme}";
// OWIN 서버의 Login 페이지로 연결
webView21.Source = new Uri($"{Pub.WebServiceURL}/home/login");
label1.Visible = false;
}
catch (Exception ex)
{
MessageBox.Show($"WebView2 초기화 실패: {ex.Message}");
}
}
// WebView2에서 보낸 메시지를 받아서 처리
private void WebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
{
try
{
var message = e.TryGetWebMessageAsString();
if (message == "LOGIN_SUCCESS")
{
// UI 스레드에서 실행
this.Invoke(new Action(() =>
{
// button1_Click과 동일한 로직 실행
ExecuteLoginLogic();
}));
}
}
catch (Exception ex)
{
Console.WriteLine($"WebView2 메시지 처리 오류: {ex.Message}");
}
}
// 로그인 성공 시 실행할 로직 (button1_Click과 동일)
private void ExecuteLoginLogic()
{
DateTime dt = DateTime.Now;
// 로그인 정보가 이미 설정되어 있다고 가정 (웹에서 처리됨)
if (string.IsNullOrEmpty(FCOMMON.info.Login.no))
{
MessageBox.Show("로그인 정보가 설정되지 않았습니다.");
return;
}
try
{
// 로그인정보 기록
AddLoginInfo();
//210221
Pub.MakeAutoJobReportbyLogin();
//210613
Pub.MakeAutoJobReportByAuto();
DialogResult = DialogResult.OK;
FCOMMON.info.Login.loginusetime = (DateTime.Now - dt).TotalMilliseconds;
}
catch (Exception ex)
{
Util.MsgE("로그인 처리 중 오류가 발생했습니다.\n\n" + ex.Message);
DialogResult = System.Windows.Forms.DialogResult.Cancel;
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureVisibleAndUsableSize();
}
private void fLogin_Load(object sender, EventArgs e)
{
//EnsureVisibleAndUsableSize();
var list = Pub.setting.lastid.Split(';');
foreach (var item in list)
if (item != "") tbID.Items.Add(item);
if (tbID.Items.Count > 0) tbID.SelectedIndex = 0;
//S1 사용자 그룹목록 확인
//var tas1 = new S1ACCESS300Entities();
//var deptlist = tas1.VIEW_CARD_PERSON
// .Where(t => t.CardStatusID == 0 && string.IsNullOrEmpty(t.CardUser2) == false)
// .GroupBy(t => t.PersonUser2)
// .OrderBy(t => t.Key)
// .ToList();
//this.cmbDept.Items.Clear();
//foreach (var dept in deptlist)
// cmbDept.Items.Add(dept);
//그룹목록가져오기
//Util.MsgE(Properties.Settings.Default.CS);
var tagrp = new dsMSSQLTableAdapters.UserGroupTableAdapter();
//Util.MsgE(tagrp.Connection.ConnectionString);
var grplist = tagrp.GetData();
this.cmbDept.DataSource = grplist;
this.cmbDept.DisplayMember = "dept";
this.cmbDept.ValueMember = "gcode";
//마지막으로사용한 부서이름
if (Pub.setting.lastdpt.isEmpty()) this.cmbDept.SelectedIndex = -1;
else this.cmbDept.Text = Pub.setting.lastdpt;
if (cmbDept.SelectedIndex == -1 && Pub.setting.lastgcode.isEmpty() == false)
{
var dr = grplist.Where(t => t.gcode.Equals(Pub.setting.lastgcode)).FirstOrDefault();
if (dr != null) cmbDept.Text = dr.dept;
}
//foreach (var item in dlist)
// if (item != "") this.cmbDept.Items.Add(item);
//if (cmbDept.Items.Count > 0) cmbDept.SelectedIndex = 0;
this.Show();
Application.DoEvents();
if (this.tbID.Text.isEmpty() == false) tbPW.Focus();
else tbID.Focus();
}
private void button1_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
//if(tbID.Text != "dev" && (dt.ToShortDateString() == "2025-04-05" ||
// dt.ToShortDateString() == "2025-04-06"))
//{
// Util.MsgE("4월 5일~6일은 데이터베이스 마이그레이션 기간이므로 프로그램 사용이 중단 됩니다\n문의 010-9155-9051 (EEDP:김치균)");
// return;
//}
if (this.tbID.Text.isEmpty())
{
tbID.Focus();
return;
}
if (this.tbPW.Text.isEmpty())
{
tbPW.Focus();
return;
}
if (cmbDept.SelectedIndex < 0)
{
FCOMMON.Util.MsgE("소속 부서를 선택하세요");
cmbDept.Focus();
return;
}
List<string> idlist = new List<string>();
idlist.Add(tbID.Text.Trim());
foreach (var item in this.tbID.Items)
if (idlist.Contains(item) == false) idlist.Add(item.ToString());
//List<string> deptlist = new List<string>();
//deptlist.Add(cmbDept.Text.Trim());
//foreach (var item in this.cmbDept.Items)
// if (deptlist.Contains(item) == false) deptlist.Add(item.ToString());
//180605
var vuserlist = "";
foreach (var item in idlist)
vuserlist += ";" + item;
//var vdeptlist = "";
//foreach(var item in deptlist)
// vdeptlist += ";" + item;
var gCode = this.cmbDept.SelectedValue.ToString();// as dsMSSQL.UserGroupRow;
Pub.setting.lastid = vuserlist;// tbID.Text.Trim();
Pub.setting.lastdpt = cmbDept.Text; //부서저장 201006
Pub.setting.lastgcode = gCode;
Pub.setting.Save();
var encpass = Pub.MakePasswordEnc(tbPW.Text.Trim());
var id = tbID.Text.Trim();
//var ta = new dsMSSQLTableAdapters.QueriesTableAdapter();//.UsersTableAdapter();
try
{
if (id.ToUpper().Equals("DEV") == false)
{
var taGrpUser = new dsMSSQLTableAdapters.EETGW_GroupUserTableAdapter();
var drGrpUser = taGrpUser.GetbyID(gCode, id).FirstOrDefault();
if (drGrpUser == null)
{
Util.MsgE($"입력한 사용자 계정이 존재하지 않습니다\n\n담당부서명:{cmbDept.Text}\n부서코드:{gCode}\n\n접속 부서를 확인하시고 관리자 문의 하세요");
tbPW.SelectAll();
tbPW.Focus();
return;
}
else if (drGrpUser.level == 0)
{
Util.MsgE($"해당 계정이 활성화되지 않았습니다\n계정 담당자 문의하세요");
tbPW.SelectAll();
tbPW.Focus();
return;
}
//사용자테이블에서 암호를 확인합니다.
var taUser = new dsMSSQLTableAdapters.UsersTableAdapter();
var drUser = taUser.GetID(id).FirstOrDefault();
if (drUser == null)
{
Util.MsgE($"입력한 사용자 계정이 존재하지 않습니다\n\n담당부서명:{cmbDept.Text}\n부서코드:{gCode}\n\n접속 부서를 확인하시고 관리자 문의 하세요");
tbPW.SelectAll();
tbPW.Focus();
return;
}
else if (drUser.password.Equals(encpass) == false)
{
Util.MsgE($"암호가 일치하지 않습니다.\n암호를 분실했을 경우에는 계정담당자에 초기화를 요청 하세요");
tbPW.SelectAll();
tbPW.Focus();
return;
}
//이사용자의 부서 코드확인
//var taUser = new dsMSSQLTableAdapters.vGroupUserTableAdapter();
//var userdr = taUser.GetByID(userGcode, id).Rows[0] as dsMSSQL.vGroupUserRow;
var MaxVerstion = FCOMMON.DBM.GetMaxVersion();
if (MaxVerstion.isEmpty() == false)
{
var curversion = Application.ProductVersion;
var verchk = curversion.CompareTo(MaxVerstion);
if (verchk < 0)
{
//내버젼이 낮다
Util.MsgE("현재 구 버젼을 사용하고 있습니다.\n업데이트를 진행 하고 사용하시기 바랍니다");
}
}
FCOMMON.info.Login.no = drUser.id;
FCOMMON.info.Login.nameK = drUser.name;
FCOMMON.info.Login.dept = cmbDept.Text;// userdr.dept;// cmbDept.Text;
FCOMMON.info.Login.level = drGrpUser.level;
FCOMMON.info.Login.email = drUser.email;
FCOMMON.info.Login.nameE = drUser.nameE;
FCOMMON.info.Login.hp = drUser.hp;
FCOMMON.info.Login.tel = drUser.tel;
FCOMMON.info.Login.title = drUser.dept + "(" + drUser.grade + ")";
FCOMMON.info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
//var gcode = FCOMMON.DBM.ExecuteScalar("select isnull(gcode,'NOGCODE') from UserGroup where dept ='" + cmbDept.Text + "'");
var gperm = FCOMMON.DBM.ExecuteScalar("select isnull(permission,0) from UserGroup where dept ='" + cmbDept.Text + "'");
FCOMMON.info.Login.gcode = gCode;// gcode;
FCOMMON.info.Login.process = drUser.id == "dev" ? "개발자" : drGrpUser.Process;
FCOMMON.info.Login.permission = 0;
FCOMMON.info.Login.gpermission = int.Parse(gperm);
//FCOMMON.info.datapath = Pub.setting.SharedDataPath;
FCOMMON.info.ShowBuyerror = Pub.setting.Showbuyerror; //210625
}
else
{
if (tbPW.Text.Equals("123") == false)
{
return;
}
FCOMMON.info.Login.no = "dev";
FCOMMON.info.Login.nameK = "개발자";
FCOMMON.info.Login.dept = cmbDept.Text;// userdr.dept;// cmbDept.Text;
FCOMMON.info.Login.level = 10;
FCOMMON.info.Login.email = "";
FCOMMON.info.Login.nameE = "DEVELOPER";
FCOMMON.info.Login.hp = "";
FCOMMON.info.Login.tel = "";
FCOMMON.info.Login.title = "업무일지 개발자";
FCOMMON.info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
//var gcode = FCOMMON.DBM.ExecuteScalar("select isnull(gcode,'NOGCODE') from UserGroup where dept ='" + cmbDept.Text + "'");
var gperm = FCOMMON.DBM.ExecuteScalar("select isnull(permission,0) from UserGroup where dept ='" + cmbDept.Text + "'");
FCOMMON.info.Login.gcode = gCode;
FCOMMON.info.Login.process = "개발자";
FCOMMON.info.Login.permission = 0;
FCOMMON.info.Login.gpermission = int.Parse(gperm);
//var datapath = FCOMMON.DBM.getCodeSavlue("55", "01");
//FCOMMON.info.datapath = datapath;// Pub.setting.SharedDataPath;
FCOMMON.info.ShowBuyerror = Pub.setting.Showbuyerror; //210625
}
//if (FCOMMON.info.datapath.isEmpty() && gCode == "EET1P") //210524
// FCOMMON.info.datapath = @"\\k4fs3201n\k4bpartcenter$";
//using (var dbEnity = new EEEntitiesMain())
//{
// var drGrpUser = dbEnity.EETGW_GroupUser.Where(t => t.uid == userdr.id & t.gcode == gCode).FirstOrDefault();
// if (drGrpUser == null) FCOMMON.info.Login.process = (userdr.id == "dev" ? "개발자" : "");
// else FCOMMON.info.Login.process = drGrpUser.Process;
//}
//로그인정보 기록
AddLoginInfo();
//210221
Pub.MakeAutoJobReportbyLogin();
//210613
Pub.MakeAutoJobReportByAuto();
DialogResult = DialogResult.OK;
FCOMMON.info.Login.loginusetime = (DateTime.Now - dt).TotalMilliseconds;
}
catch (Exception ex)
{
Util.MsgE("데이터베이스 조회 실패 다음 오류 메세지를 참고하세요.\n\n" + ex.Message + "\n\n증상이 동일 할 경우 서버가 접속가능한지 먼저 확인하세요");
DialogResult = System.Windows.Forms.DialogResult.Cancel;
}
}
void AddLoginInfo()
{
string ip = string.Empty;
string hostname = Dns.GetHostName();
string fullname = System.Net.Dns.GetHostEntry("").HostName;
var nif = NetworkInterface.GetAllNetworkInterfaces();
var host = Dns.GetHostEntry(hostname);
foreach (IPAddress r in host.AddressList)
{
string str = r.ToString();
if (str != "" && str.Substring(0, 3) == "10.")
{
ip = str;
break;
}
}
if (ip == "" || hostname == "") return;
try
{
var ta = new dsMSSQLTableAdapters.EETGW_LoginInfoTableAdapter();
ta.Insert(FCOMMON.info.Login.no, DateTime.Now, ip, fullname, info.Login.no, DateTime.Now);
}
catch (Exception ex)
{
FCOMMON.Util.MsgE(ex.Message);
Console.WriteLine(ex.Message);
}
}
private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
FCOMMON.Util.RunExplorer("mailto:chikyun.kim@amkor.co.kr");
}
private void cmbDept_SelectedIndexChanged(object sender, EventArgs e)
{
//부서명이 변경되었다
label4.Text = "문의) 정보없음(?)";
var sel = cmbDept.SelectedItem as DataRowView;
if (sel == null) return;
var dr = sel.Row as dsMSSQL.UserGroupRow;
if (dr == null) return;
var admin = dr.managerinfo;
if (string.IsNullOrEmpty(admin))
admin = "--";
var dev = dr.devinfo;
if (string.IsNullOrEmpty(dev))
dev = "chikyun.kim@amkor.co.kr(T8567)";
label4.Text = $"문의) 관리:{admin},개발:{dev}";
}
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//if (System.Diagnostics.Debugger.IsAttached == false)
//{
// Util.MsgE("이 기능은 준비중 입니다");
// return;
//}
var gCode = this.cmbDept.SelectedValue.ToString();// as dsMSSQL.UserGroupRow;
FCOMMON.info.Login.gcode = gCode;
FCOMMON.info.Login.no = "new";
FCOMMON.info.Login.dept = this.cmbDept.Text;
var dlg = FCOMMON.Util.MsgQ($"현재 선택된 그룹[{this.cmbDept.Text}]의 사용자를 추가할까요?\n" +
"추가된 사용자는 담당자로부터 승인 완료되어야 접속이 가능 합니다\n" +
"사용자 추가 후 그룹담당자에게 문의 하시기 바랍니다");
if (dlg != DialogResult.Yes) return;
var f = new _Common.fAddNewUser(cmbDept.Text, string.Empty, 0);//.fUserInfo();
dlg = f.ShowDialog();
if (dlg == DialogResult.OK)
{
tbID.Text = f.tbId.Text.Trim();
}
}
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
var lv = this.listView1.FocusedItem;
if (lv == null) return;
if (lv.Tag == null) return;
var msg = lv.Tag.ToString();
Util.MsgI(msg);
}
}
}

View File

@@ -1,160 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>