Compare commits
10 Commits
master
...
7ca6712e29
| Author | SHA1 | Date | |
|---|---|---|---|
| 7ca6712e29 | |||
| 2f1c2483f0 | |||
|
|
3d75d1192d | ||
| a13306115b | |||
|
|
5949e3e7a1 | ||
|
|
6cd5ab6f1c | ||
|
|
9be6834d9f | ||
|
|
12d6c2dbfb | ||
|
|
8b63566684 | ||
|
|
b7c6e530dd |
25
unimarc/.claude/settings.local.json
Normal file
25
unimarc/.claude/settings.local.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"hooks": {
|
||||||
|
"conversation-start": "새로운 대화를 시작할 때 항상 CLAUDE.md 파일을 자동으로 읽고 프로젝트 컨텍스트를 파악하세요",
|
||||||
|
"user-prompt-submit": "작업을 시작하기 전에 항상 CLAUDE.md 파일을 읽고 참조하세요"
|
||||||
|
},
|
||||||
|
"rules": [
|
||||||
|
"대화 시작 시 반드시 CLAUDE.md 파일을 읽어서 프로젝트 컨텍스트를 파악할 것",
|
||||||
|
"모든 답변은 한국어로 작성할 것",
|
||||||
|
"UniMarc 프로젝트는 C# WinForms 기반의 도서관 관리 시스템임"
|
||||||
|
],
|
||||||
|
"context_files": [
|
||||||
|
"CLAUDE.md"
|
||||||
|
],
|
||||||
|
"project_info": {
|
||||||
|
"name": "UniMarc",
|
||||||
|
"type": "도서관 자료 관리 시스템",
|
||||||
|
"tech_stack": "C# WinForms, .NET Framework 4.7.2, MySQL"
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"WebFetch(domain:lib.namgu.gwangju.kr)"
|
||||||
|
],
|
||||||
|
"deny": []
|
||||||
|
}
|
||||||
|
}
|
||||||
6
unimarc/.cursor/settings.json
Normal file
6
unimarc/.cursor/settings.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"hooks": {
|
||||||
|
"conversation-start": "새로운 대화를 시작할 때 항상 CLAUDE.md 파일을 자동으로 읽고 프로젝트 컨텍스트를 파악하세요",
|
||||||
|
"user-prompt-submit": "작업을 시작하기 전에 항상 CLAUDE.md 파일을 읽고 참조하세요"
|
||||||
|
}
|
||||||
|
}
|
||||||
9
unimarc/.cursorignore
Normal file
9
unimarc/.cursorignore
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# 이 파일들은 항상 컨텍스트에 포함
|
||||||
|
!CLAUDE.md
|
||||||
|
!.claude/settings.local.json
|
||||||
|
|
||||||
|
# 제외할 파일들
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
*.dll
|
||||||
|
*.pdb
|
||||||
1
unimarc/.cursorrules
Normal file
1
unimarc/.cursorrules
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CLAUDE.md 파일을 참조하여 답변하세요
|
||||||
44
unimarc/CLAUDE.md
Normal file
44
unimarc/CLAUDE.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# ⚠️ 중요: 대화 시작시 이 파일을 반드시 읽으세요!
|
||||||
|
# 답변은 가급적이면 한글로!
|
||||||
|
# UniMarc 프로젝트 - Claude 작업 가이드
|
||||||
|
|
||||||
|
> **Claude에게**: 대화를 시작할 때마다 이 파일을 먼저 읽어서 프로젝트 컨텍스트를 파악하세요.
|
||||||
|
|
||||||
|
## 프로젝트 개요
|
||||||
|
- **프로젝트명**: UniMarc (도서관 자료 관리 시스템)
|
||||||
|
- **기술스택**: C# WinForms, .NET Framework 4.7.2
|
||||||
|
- **데이터베이스**: MySQL
|
||||||
|
- **주요기능**: 마크 작성, 복본조사, DLS 연동, 도서 정보 관리
|
||||||
|
|
||||||
|
## 코딩 컨벤션
|
||||||
|
- 파일명: PascalCase (예: DLS_Copy.cs)
|
||||||
|
- 클래스명: PascalCase
|
||||||
|
- 메서드명: PascalCase
|
||||||
|
- 변수명: camelCase
|
||||||
|
- 상수명: UPPER_CASE
|
||||||
|
|
||||||
|
## 주요 디렉토리 구조
|
||||||
|
- `/마크/`: 마크 관련 폼들
|
||||||
|
- `/납품관리/`: 납품 관리 관련 폼들
|
||||||
|
- `/마스터/`: 마스터 데이터 관리 폼들
|
||||||
|
- `/홈/`: 메인 화면 관련 폼들
|
||||||
|
- `/회계/`: 회계 관련 폼들
|
||||||
|
|
||||||
|
## 개발 시 주의사항
|
||||||
|
1. WebView2 사용 시 async/await 패턴 적용
|
||||||
|
2. 데이터베이스 연결은 Helper_DB 클래스 사용
|
||||||
|
3. 에러 처리는 try-catch 블록으로 처리
|
||||||
|
4. 한글 주석 사용
|
||||||
|
|
||||||
|
## 빌드 및 배포
|
||||||
|
- Visual Studio 2019 이상 필요
|
||||||
|
- NuGet 패키지 복원 후 빌드
|
||||||
|
- WebView2 런타임 필요
|
||||||
|
- NetFX 프로젝트이므로 dotnet 명령은 사용 불가
|
||||||
|
|
||||||
|
## MsBuild 실행파일 위치 (경로에 공백이 있으니 쌍따옴표로 감싸야 함)
|
||||||
|
## 매개변수 입력할때 platform 은 제거하고 그냥 프로젝트명만 입력
|
||||||
|
F:\(VHD) Program Files\Microsoft Visual Studio\2022\MSBuild\Current\Bin\msbuild.exe
|
||||||
|
|
||||||
|
## 프로젝트 파일명
|
||||||
|
UniMarc.csproj
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<configSections>
|
<configSections>
|
||||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
||||||
@@ -18,19 +18,39 @@
|
|||||||
</basicHttpBinding>
|
</basicHttpBinding>
|
||||||
</bindings>
|
</bindings>
|
||||||
<client>
|
<client>
|
||||||
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding"
|
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding" bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap" name="BaroService_FAXSoap" />
|
||||||
bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap"
|
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding" bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap" name="BaroService_TISoap" />
|
||||||
name="BaroService_FAXSoap" />
|
|
||||||
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding"
|
|
||||||
bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap"
|
|
||||||
name="BaroService_TISoap" />
|
|
||||||
</client>
|
</client>
|
||||||
</system.serviceModel>
|
</system.serviceModel>
|
||||||
<runtime>
|
<runtime>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral" />
|
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral" />
|
||||||
<bindingRedirect oldVersion="0.0.0.0-2020.0.1.0" newVersion="2020.0.1.0"/>
|
<bindingRedirect oldVersion="0.0.0.0-2025.0.0.1" newVersion="2025.0.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-8.0.0.5" newVersion="8.0.0.5" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="AngleSharp" publicKeyToken="e83494dcdc6d31ea" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace UniMarc
|
|
||||||
{
|
|
||||||
public static class CUtill
|
|
||||||
{
|
|
||||||
public static arUtil.Log mLog;
|
|
||||||
|
|
||||||
public static void MsgI(string m)
|
|
||||||
{
|
|
||||||
//MessageWindow.VisibleAll(false);
|
|
||||||
MessageBox.Show(m, "CHECK", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
||||||
//MessageWindow.VisibleAll(true);
|
|
||||||
}
|
|
||||||
public static void MsgE(string m)
|
|
||||||
{
|
|
||||||
//MessageWindow.VisibleAll(false);
|
|
||||||
MessageBox.Show(m, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
||||||
//MessageWindow.VisibleAll(true);
|
|
||||||
}
|
|
||||||
public static DialogResult MsgQ(string m)
|
|
||||||
{
|
|
||||||
//MessageWindow.VisibleAll(false);
|
|
||||||
DialogResult dlg = MessageBox.Show(m, "CHECK", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
|
|
||||||
//MessageWindow.VisibleAll(true);
|
|
||||||
return dlg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
107
unimarc/unimarc/Main.Designer.cs
generated
107
unimarc/unimarc/Main.Designer.cs
generated
@@ -131,7 +131,9 @@
|
|||||||
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
|
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
this.IPText = new System.Windows.Forms.ToolStripLabel();
|
this.IPText = new System.Windows.Forms.ToolStripLabel();
|
||||||
|
this.lblStatus = new System.Windows.Forms.ToolStripLabel();
|
||||||
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
||||||
|
this.복본조사2 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.menuStrip1.SuspendLayout();
|
this.menuStrip1.SuspendLayout();
|
||||||
this.panel1.SuspendLayout();
|
this.panel1.SuspendLayout();
|
||||||
this.toolStrip1.SuspendLayout();
|
this.toolStrip1.SuspendLayout();
|
||||||
@@ -170,28 +172,28 @@
|
|||||||
// 사업체정보
|
// 사업체정보
|
||||||
//
|
//
|
||||||
this.사업체정보.Name = "사업체정보";
|
this.사업체정보.Name = "사업체정보";
|
||||||
this.사업체정보.Size = new System.Drawing.Size(175, 22);
|
this.사업체정보.Size = new System.Drawing.Size(180, 22);
|
||||||
this.사업체정보.Text = "사업체 정보";
|
this.사업체정보.Text = "사업체 정보";
|
||||||
this.사업체정보.Click += new System.EventHandler(this.사용자정보ToolStripMenuItem_Click);
|
this.사업체정보.Click += new System.EventHandler(this.사용자정보ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 사용자관리
|
// 사용자관리
|
||||||
//
|
//
|
||||||
this.사용자관리.Name = "사용자관리";
|
this.사용자관리.Name = "사용자관리";
|
||||||
this.사용자관리.Size = new System.Drawing.Size(175, 22);
|
this.사용자관리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.사용자관리.Text = "사용자 관리";
|
this.사용자관리.Text = "사용자 관리";
|
||||||
this.사용자관리.Click += new System.EventHandler(this.사용자관리ToolStripMenuItem_Click);
|
this.사용자관리.Click += new System.EventHandler(this.사용자관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 납품거래처관리
|
// 납품거래처관리
|
||||||
//
|
//
|
||||||
this.납품거래처관리.Name = "납품거래처관리";
|
this.납품거래처관리.Name = "납품거래처관리";
|
||||||
this.납품거래처관리.Size = new System.Drawing.Size(175, 22);
|
this.납품거래처관리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.납품거래처관리.Text = "납품 / 거래처 관리";
|
this.납품거래처관리.Text = "납품 / 거래처 관리";
|
||||||
this.납품거래처관리.Click += new System.EventHandler(this.납품거래처관리ToolStripMenuItem_Click);
|
this.납품거래처관리.Click += new System.EventHandler(this.납품거래처관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 주문처관리
|
// 주문처관리
|
||||||
//
|
//
|
||||||
this.주문처관리.Name = "주문처관리";
|
this.주문처관리.Name = "주문처관리";
|
||||||
this.주문처관리.Size = new System.Drawing.Size(175, 22);
|
this.주문처관리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.주문처관리.Text = "주문처 관리";
|
this.주문처관리.Text = "주문처 관리";
|
||||||
this.주문처관리.Click += new System.EventHandler(this.주문처관리ToolStripMenuItem_Click);
|
this.주문처관리.Click += new System.EventHandler(this.주문처관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -199,14 +201,14 @@
|
|||||||
//
|
//
|
||||||
this.비밀번호변경.Enabled = false;
|
this.비밀번호변경.Enabled = false;
|
||||||
this.비밀번호변경.Name = "비밀번호변경";
|
this.비밀번호변경.Name = "비밀번호변경";
|
||||||
this.비밀번호변경.Size = new System.Drawing.Size(175, 22);
|
this.비밀번호변경.Size = new System.Drawing.Size(180, 22);
|
||||||
this.비밀번호변경.Text = "비밀번호 변경";
|
this.비밀번호변경.Text = "비밀번호 변경";
|
||||||
this.비밀번호변경.Click += new System.EventHandler(this.비밀번호변경ToolStripMenuItem_Click);
|
this.비밀번호변경.Click += new System.EventHandler(this.비밀번호변경ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 도서정보관리
|
// 도서정보관리
|
||||||
//
|
//
|
||||||
this.도서정보관리.Name = "도서정보관리";
|
this.도서정보관리.Name = "도서정보관리";
|
||||||
this.도서정보관리.Size = new System.Drawing.Size(175, 22);
|
this.도서정보관리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.도서정보관리.Text = "도서정보 관리";
|
this.도서정보관리.Text = "도서정보 관리";
|
||||||
this.도서정보관리.Click += new System.EventHandler(this.도서정보관리ToolStripMenuItem_Click);
|
this.도서정보관리.Click += new System.EventHandler(this.도서정보관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -214,7 +216,7 @@
|
|||||||
//
|
//
|
||||||
this.사용대장.Enabled = false;
|
this.사용대장.Enabled = false;
|
||||||
this.사용대장.Name = "사용대장";
|
this.사용대장.Name = "사용대장";
|
||||||
this.사용대장.Size = new System.Drawing.Size(175, 22);
|
this.사용대장.Size = new System.Drawing.Size(180, 22);
|
||||||
this.사용대장.Text = "사용대장";
|
this.사용대장.Text = "사용대장";
|
||||||
this.사용대장.Click += new System.EventHandler(this.사용대장ToolStripMenuItem_Click);
|
this.사용대장.Click += new System.EventHandler(this.사용대장ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -235,49 +237,49 @@
|
|||||||
// 목록등록
|
// 목록등록
|
||||||
//
|
//
|
||||||
this.목록등록.Name = "목록등록";
|
this.목록등록.Name = "목록등록";
|
||||||
this.목록등록.Size = new System.Drawing.Size(166, 22);
|
this.목록등록.Size = new System.Drawing.Size(180, 22);
|
||||||
this.목록등록.Text = "물품등록";
|
this.목록등록.Text = "물품등록";
|
||||||
this.목록등록.Click += new System.EventHandler(this.물품등록ToolStripMenuItem_Click);
|
this.목록등록.Click += new System.EventHandler(this.물품등록ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 목록조회
|
// 목록조회
|
||||||
//
|
//
|
||||||
this.목록조회.Name = "목록조회";
|
this.목록조회.Name = "목록조회";
|
||||||
this.목록조회.Size = new System.Drawing.Size(166, 22);
|
this.목록조회.Size = new System.Drawing.Size(180, 22);
|
||||||
this.목록조회.Text = "목록조회";
|
this.목록조회.Text = "목록조회";
|
||||||
this.목록조회.Click += new System.EventHandler(this.목록등록편의ToolStripMenuItem_Click);
|
this.목록조회.Click += new System.EventHandler(this.목록등록편의ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 목록집계
|
// 목록집계
|
||||||
//
|
//
|
||||||
this.목록집계.Name = "목록집계";
|
this.목록집계.Name = "목록집계";
|
||||||
this.목록집계.Size = new System.Drawing.Size(166, 22);
|
this.목록집계.Size = new System.Drawing.Size(180, 22);
|
||||||
this.목록집계.Text = "목록집계";
|
this.목록집계.Text = "목록집계";
|
||||||
this.목록집계.Click += new System.EventHandler(this.목록집계ToolStripMenuItem_Click);
|
this.목록집계.Click += new System.EventHandler(this.목록집계ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 주문입력
|
// 주문입력
|
||||||
//
|
//
|
||||||
this.주문입력.Name = "주문입력";
|
this.주문입력.Name = "주문입력";
|
||||||
this.주문입력.Size = new System.Drawing.Size(166, 22);
|
this.주문입력.Size = new System.Drawing.Size(180, 22);
|
||||||
this.주문입력.Text = "주문입력";
|
this.주문입력.Text = "주문입력";
|
||||||
this.주문입력.Click += new System.EventHandler(this.주문입력ToolStripMenuItem_Click);
|
this.주문입력.Click += new System.EventHandler(this.주문입력ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 입고작업
|
// 입고작업
|
||||||
//
|
//
|
||||||
this.입고작업.Name = "입고작업";
|
this.입고작업.Name = "입고작업";
|
||||||
this.입고작업.Size = new System.Drawing.Size(166, 22);
|
this.입고작업.Size = new System.Drawing.Size(180, 22);
|
||||||
this.입고작업.Text = "입고작업";
|
this.입고작업.Text = "입고작업";
|
||||||
this.입고작업.Click += new System.EventHandler(this.매입ToolStripMenuItem_Click);
|
this.입고작업.Click += new System.EventHandler(this.매입ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 재고입력및조회
|
// 재고입력및조회
|
||||||
//
|
//
|
||||||
this.재고입력및조회.Name = "재고입력및조회";
|
this.재고입력및조회.Name = "재고입력및조회";
|
||||||
this.재고입력및조회.Size = new System.Drawing.Size(166, 22);
|
this.재고입력및조회.Size = new System.Drawing.Size(180, 22);
|
||||||
this.재고입력및조회.Text = "재고입력 및 조회";
|
this.재고입력및조회.Text = "재고입력 및 조회";
|
||||||
this.재고입력및조회.Click += new System.EventHandler(this.재고입력및조회ToolStripMenuItem_Click);
|
this.재고입력및조회.Click += new System.EventHandler(this.재고입력및조회ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 반품처리
|
// 반품처리
|
||||||
//
|
//
|
||||||
this.반품처리.Name = "반품처리";
|
this.반품처리.Name = "반품처리";
|
||||||
this.반품처리.Size = new System.Drawing.Size(166, 22);
|
this.반품처리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.반품처리.Text = "반품처리";
|
this.반품처리.Text = "반품처리";
|
||||||
this.반품처리.Click += new System.EventHandler(this.반품처리ToolStripMenuItem_Click);
|
this.반품처리.Click += new System.EventHandler(this.반품처리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -296,14 +298,14 @@
|
|||||||
// 송금내역조회
|
// 송금내역조회
|
||||||
//
|
//
|
||||||
this.송금내역조회.Name = "송금내역조회";
|
this.송금내역조회.Name = "송금내역조회";
|
||||||
this.송금내역조회.Size = new System.Drawing.Size(154, 22);
|
this.송금내역조회.Size = new System.Drawing.Size(180, 22);
|
||||||
this.송금내역조회.Text = "송금 내역 조회";
|
this.송금내역조회.Text = "송금 내역 조회";
|
||||||
this.송금내역조회.Click += new System.EventHandler(this.송금내역조회ToolStripMenuItem_Click);
|
this.송금내역조회.Click += new System.EventHandler(this.송금내역조회ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 송금등록
|
// 송금등록
|
||||||
//
|
//
|
||||||
this.송금등록.Name = "송금등록";
|
this.송금등록.Name = "송금등록";
|
||||||
this.송금등록.Size = new System.Drawing.Size(154, 22);
|
this.송금등록.Size = new System.Drawing.Size(180, 22);
|
||||||
this.송금등록.Text = "송금 등록";
|
this.송금등록.Text = "송금 등록";
|
||||||
this.송금등록.Click += new System.EventHandler(this.송금등록ToolStripMenuItem_Click);
|
this.송금등록.Click += new System.EventHandler(this.송금등록ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -314,7 +316,7 @@
|
|||||||
this.매입장부,
|
this.매입장부,
|
||||||
this.매입미결제ToolStripMenuItem});
|
this.매입미결제ToolStripMenuItem});
|
||||||
this.매입.Name = "매입";
|
this.매입.Name = "매입";
|
||||||
this.매입.Size = new System.Drawing.Size(154, 22);
|
this.매입.Size = new System.Drawing.Size(180, 22);
|
||||||
this.매입.Text = "매입";
|
this.매입.Text = "매입";
|
||||||
//
|
//
|
||||||
// 매입집계
|
// 매입집계
|
||||||
@@ -347,7 +349,7 @@
|
|||||||
this.매출조회,
|
this.매출조회,
|
||||||
this.매출집계});
|
this.매출집계});
|
||||||
this.매출.Name = "매출";
|
this.매출.Name = "매출";
|
||||||
this.매출.Size = new System.Drawing.Size(154, 22);
|
this.매출.Size = new System.Drawing.Size(180, 22);
|
||||||
this.매출.Text = "매출";
|
this.매출.Text = "매출";
|
||||||
//
|
//
|
||||||
// 매출입력
|
// 매출입력
|
||||||
@@ -381,7 +383,7 @@
|
|||||||
// 파트타임관리
|
// 파트타임관리
|
||||||
//
|
//
|
||||||
this.파트타임관리.Name = "파트타임관리";
|
this.파트타임관리.Name = "파트타임관리";
|
||||||
this.파트타임관리.Size = new System.Drawing.Size(154, 22);
|
this.파트타임관리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.파트타임관리.Text = "파트타임 관리";
|
this.파트타임관리.Text = "파트타임 관리";
|
||||||
this.파트타임관리.Click += new System.EventHandler(this.파트타임관리ToolStripMenuItem_Click);
|
this.파트타임관리.Click += new System.EventHandler(this.파트타임관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -407,13 +409,13 @@
|
|||||||
this.불용어,
|
this.불용어,
|
||||||
this.작업지시서});
|
this.작업지시서});
|
||||||
this.마크설정.Name = "마크설정";
|
this.마크설정.Name = "마크설정";
|
||||||
this.마크설정.Size = new System.Drawing.Size(156, 22);
|
this.마크설정.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크설정.Text = "설정";
|
this.마크설정.Text = "설정";
|
||||||
//
|
//
|
||||||
// 단축키설정
|
// 단축키설정
|
||||||
//
|
//
|
||||||
this.단축키설정.Name = "단축키설정";
|
this.단축키설정.Name = "단축키설정";
|
||||||
this.단축키설정.Size = new System.Drawing.Size(138, 22);
|
this.단축키설정.Size = new System.Drawing.Size(180, 22);
|
||||||
this.단축키설정.Text = "단축키";
|
this.단축키설정.Text = "단축키";
|
||||||
this.단축키설정.Visible = false;
|
this.단축키설정.Visible = false;
|
||||||
this.단축키설정.Click += new System.EventHandler(this.단축키설정ToolStripMenuItem_Click);
|
this.단축키설정.Click += new System.EventHandler(this.단축키설정ToolStripMenuItem_Click);
|
||||||
@@ -421,14 +423,14 @@
|
|||||||
// 매크로문구
|
// 매크로문구
|
||||||
//
|
//
|
||||||
this.매크로문구.Name = "매크로문구";
|
this.매크로문구.Name = "매크로문구";
|
||||||
this.매크로문구.Size = new System.Drawing.Size(138, 22);
|
this.매크로문구.Size = new System.Drawing.Size(180, 22);
|
||||||
this.매크로문구.Text = "매크로 문구";
|
this.매크로문구.Text = "매크로 문구";
|
||||||
this.매크로문구.Click += new System.EventHandler(this.매크로문구설정ToolStripMenuItem_Click);
|
this.매크로문구.Click += new System.EventHandler(this.매크로문구설정ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 불용어
|
// 불용어
|
||||||
//
|
//
|
||||||
this.불용어.Name = "불용어";
|
this.불용어.Name = "불용어";
|
||||||
this.불용어.Size = new System.Drawing.Size(138, 22);
|
this.불용어.Size = new System.Drawing.Size(180, 22);
|
||||||
this.불용어.Text = "불용어";
|
this.불용어.Text = "불용어";
|
||||||
this.불용어.Visible = false;
|
this.불용어.Visible = false;
|
||||||
this.불용어.Click += new System.EventHandler(this.불용어ToolStripMenuItem_Click);
|
this.불용어.Click += new System.EventHandler(this.불용어ToolStripMenuItem_Click);
|
||||||
@@ -436,7 +438,7 @@
|
|||||||
// 작업지시서
|
// 작업지시서
|
||||||
//
|
//
|
||||||
this.작업지시서.Name = "작업지시서";
|
this.작업지시서.Name = "작업지시서";
|
||||||
this.작업지시서.Size = new System.Drawing.Size(138, 22);
|
this.작업지시서.Size = new System.Drawing.Size(180, 22);
|
||||||
this.작업지시서.Text = "작업지시서";
|
this.작업지시서.Text = "작업지시서";
|
||||||
this.작업지시서.Visible = false;
|
this.작업지시서.Visible = false;
|
||||||
this.작업지시서.Click += new System.EventHandler(this.작업지시서ToolStripMenuItem_Click);
|
this.작업지시서.Click += new System.EventHandler(this.작업지시서ToolStripMenuItem_Click);
|
||||||
@@ -449,50 +451,51 @@
|
|||||||
this.소장자료검색,
|
this.소장자료검색,
|
||||||
this.마크정리,
|
this.마크정리,
|
||||||
this.복본조사1,
|
this.복본조사1,
|
||||||
|
this.복본조사2,
|
||||||
this.iSBN조회});
|
this.iSBN조회});
|
||||||
this.마크작업.Name = "마크작업";
|
this.마크작업.Name = "마크작업";
|
||||||
this.마크작업.Size = new System.Drawing.Size(156, 22);
|
this.마크작업.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크작업.Text = "마크 작업";
|
this.마크작업.Text = "마크 작업";
|
||||||
//
|
//
|
||||||
// 마크작성
|
// 마크작성
|
||||||
//
|
//
|
||||||
this.마크작성.Name = "마크작성";
|
this.마크작성.Name = "마크작성";
|
||||||
this.마크작성.Size = new System.Drawing.Size(146, 22);
|
this.마크작성.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크작성.Text = "마크 작성";
|
this.마크작성.Text = "마크 작성";
|
||||||
this.마크작성.Click += new System.EventHandler(this.마크작성ToolStripMenuItem_Click);
|
this.마크작성.Click += new System.EventHandler(this.마크작성ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 마크목록
|
// 마크목록
|
||||||
//
|
//
|
||||||
this.마크목록.Name = "마크목록";
|
this.마크목록.Name = "마크목록";
|
||||||
this.마크목록.Size = new System.Drawing.Size(146, 22);
|
this.마크목록.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크목록.Text = "마크 목록";
|
this.마크목록.Text = "마크 목록";
|
||||||
this.마크목록.Click += new System.EventHandler(this.마크목록ToolStripMenuItem_Click);
|
this.마크목록.Click += new System.EventHandler(this.마크목록ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 소장자료검색
|
// 소장자료검색
|
||||||
//
|
//
|
||||||
this.소장자료검색.Name = "소장자료검색";
|
this.소장자료검색.Name = "소장자료검색";
|
||||||
this.소장자료검색.Size = new System.Drawing.Size(146, 22);
|
this.소장자료검색.Size = new System.Drawing.Size(180, 22);
|
||||||
this.소장자료검색.Text = "소장자료검색";
|
this.소장자료검색.Text = "소장자료검색";
|
||||||
this.소장자료검색.Click += new System.EventHandler(this.소장자료검색ToolStripMenuItem_Click);
|
this.소장자료검색.Click += new System.EventHandler(this.소장자료검색ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 마크정리
|
// 마크정리
|
||||||
//
|
//
|
||||||
this.마크정리.Name = "마크정리";
|
this.마크정리.Name = "마크정리";
|
||||||
this.마크정리.Size = new System.Drawing.Size(146, 22);
|
this.마크정리.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크정리.Text = "마크 정리";
|
this.마크정리.Text = "마크 정리";
|
||||||
this.마크정리.Click += new System.EventHandler(this.마크정리ToolStripMenuItem_Click);
|
this.마크정리.Click += new System.EventHandler(this.마크정리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 복본조사1
|
// 복본조사1
|
||||||
//
|
//
|
||||||
this.복본조사1.Name = "복본조사1";
|
this.복본조사1.Name = "복본조사1";
|
||||||
this.복본조사1.Size = new System.Drawing.Size(146, 22);
|
this.복본조사1.Size = new System.Drawing.Size(180, 22);
|
||||||
this.복본조사1.Text = "복본조사";
|
this.복본조사1.Text = "복본조사";
|
||||||
this.복본조사1.Click += new System.EventHandler(this.복본조사ToolStripMenuItem1_Click);
|
this.복본조사1.Click += new System.EventHandler(this.복본조사ToolStripMenuItem1_Click);
|
||||||
//
|
//
|
||||||
// iSBN조회
|
// iSBN조회
|
||||||
//
|
//
|
||||||
this.iSBN조회.Name = "iSBN조회";
|
this.iSBN조회.Name = "iSBN조회";
|
||||||
this.iSBN조회.Size = new System.Drawing.Size(146, 22);
|
this.iSBN조회.Size = new System.Drawing.Size(180, 22);
|
||||||
this.iSBN조회.Text = "ISBN 조회";
|
this.iSBN조회.Text = "ISBN 조회";
|
||||||
this.iSBN조회.Click += new System.EventHandler(this.iSBN조회ToolStripMenuItem_Click);
|
this.iSBN조회.Click += new System.EventHandler(this.iSBN조회ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -502,7 +505,7 @@
|
|||||||
this.목록,
|
this.목록,
|
||||||
this.편목});
|
this.편목});
|
||||||
this.dVDCDLPToolStripMenuItem.Name = "dVDCDLPToolStripMenuItem";
|
this.dVDCDLPToolStripMenuItem.Name = "dVDCDLPToolStripMenuItem";
|
||||||
this.dVDCDLPToolStripMenuItem.Size = new System.Drawing.Size(156, 22);
|
this.dVDCDLPToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
||||||
this.dVDCDLPToolStripMenuItem.Text = "DVD / CD / LP";
|
this.dVDCDLPToolStripMenuItem.Text = "DVD / CD / LP";
|
||||||
//
|
//
|
||||||
// 목록
|
// 목록
|
||||||
@@ -526,7 +529,7 @@
|
|||||||
this.마크반입,
|
this.마크반입,
|
||||||
this.마크반출});
|
this.마크반출});
|
||||||
this.반입및반출.Name = "반입및반출";
|
this.반입및반출.Name = "반입및반출";
|
||||||
this.반입및반출.Size = new System.Drawing.Size(156, 22);
|
this.반입및반출.Size = new System.Drawing.Size(180, 22);
|
||||||
this.반입및반출.Text = "반입 및 반출";
|
this.반입및반출.Text = "반입 및 반출";
|
||||||
//
|
//
|
||||||
// 마크반입
|
// 마크반입
|
||||||
@@ -551,7 +554,7 @@
|
|||||||
this.검수,
|
this.검수,
|
||||||
this.저자기호});
|
this.저자기호});
|
||||||
this.부가기능.Name = "부가기능";
|
this.부가기능.Name = "부가기능";
|
||||||
this.부가기능.Size = new System.Drawing.Size(156, 22);
|
this.부가기능.Size = new System.Drawing.Size(180, 22);
|
||||||
this.부가기능.Text = "부가기능";
|
this.부가기능.Text = "부가기능";
|
||||||
//
|
//
|
||||||
// 마크수집
|
// 마크수집
|
||||||
@@ -592,7 +595,7 @@
|
|||||||
this.DLS조회,
|
this.DLS조회,
|
||||||
this.dLS복본조사});
|
this.dLS복본조사});
|
||||||
this.DLS.Name = "DLS";
|
this.DLS.Name = "DLS";
|
||||||
this.DLS.Size = new System.Drawing.Size(156, 22);
|
this.DLS.Size = new System.Drawing.Size(180, 22);
|
||||||
this.DLS.Text = "DLS";
|
this.DLS.Text = "DLS";
|
||||||
//
|
//
|
||||||
// DLS조회
|
// DLS조회
|
||||||
@@ -616,7 +619,7 @@
|
|||||||
this.마크통계,
|
this.마크통계,
|
||||||
this.장비관리});
|
this.장비관리});
|
||||||
this.마크기타.Name = "마크기타";
|
this.마크기타.Name = "마크기타";
|
||||||
this.마크기타.Size = new System.Drawing.Size(156, 22);
|
this.마크기타.Size = new System.Drawing.Size(180, 22);
|
||||||
this.마크기타.Text = "기타";
|
this.마크기타.Text = "기타";
|
||||||
//
|
//
|
||||||
// 서류작성
|
// 서류작성
|
||||||
@@ -761,48 +764,48 @@
|
|||||||
this.이용자관리ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.이용자관리ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
this.신규사업자등록ToolStripMenuItem});
|
this.신규사업자등록ToolStripMenuItem});
|
||||||
this.이용자관리ToolStripMenuItem.Name = "이용자관리ToolStripMenuItem";
|
this.이용자관리ToolStripMenuItem.Name = "이용자관리ToolStripMenuItem";
|
||||||
this.이용자관리ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.이용자관리ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
|
||||||
this.이용자관리ToolStripMenuItem.Text = "이용자 관리";
|
this.이용자관리ToolStripMenuItem.Text = "이용자 관리";
|
||||||
//
|
//
|
||||||
// 신규사업자등록ToolStripMenuItem
|
// 신규사업자등록ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.신규사업자등록ToolStripMenuItem.Name = "신규사업자등록ToolStripMenuItem";
|
this.신규사업자등록ToolStripMenuItem.Name = "신규사업자등록ToolStripMenuItem";
|
||||||
this.신규사업자등록ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.신규사업자등록ToolStripMenuItem.Size = new System.Drawing.Size(138, 22);
|
||||||
this.신규사업자등록ToolStripMenuItem.Text = "사업자 관리";
|
this.신규사업자등록ToolStripMenuItem.Text = "사업자 관리";
|
||||||
this.신규사업자등록ToolStripMenuItem.Click += new System.EventHandler(this.신규사업자등록ToolStripMenuItem_Click);
|
this.신규사업자등록ToolStripMenuItem.Click += new System.EventHandler(this.신규사업자등록ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 공지발송ToolStripMenuItem1
|
// 공지발송ToolStripMenuItem1
|
||||||
//
|
//
|
||||||
this.공지발송ToolStripMenuItem1.Name = "공지발송ToolStripMenuItem1";
|
this.공지발송ToolStripMenuItem1.Name = "공지발송ToolStripMenuItem1";
|
||||||
this.공지발송ToolStripMenuItem1.Size = new System.Drawing.Size(180, 22);
|
this.공지발송ToolStripMenuItem1.Size = new System.Drawing.Size(178, 22);
|
||||||
this.공지발송ToolStripMenuItem1.Text = "공지 발송";
|
this.공지발송ToolStripMenuItem1.Text = "공지 발송";
|
||||||
this.공지발송ToolStripMenuItem1.Click += new System.EventHandler(this.공지발송ToolStripMenuItem1_Click);
|
this.공지발송ToolStripMenuItem1.Click += new System.EventHandler(this.공지발송ToolStripMenuItem1_Click);
|
||||||
//
|
//
|
||||||
// 매출내역ToolStripMenuItem
|
// 매출내역ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.매출내역ToolStripMenuItem.Name = "매출내역ToolStripMenuItem";
|
this.매출내역ToolStripMenuItem.Name = "매출내역ToolStripMenuItem";
|
||||||
this.매출내역ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.매출내역ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
|
||||||
this.매출내역ToolStripMenuItem.Text = "매출내역";
|
this.매출내역ToolStripMenuItem.Text = "매출내역";
|
||||||
this.매출내역ToolStripMenuItem.Click += new System.EventHandler(this.매출내역ToolStripMenuItem_Click);
|
this.매출내역ToolStripMenuItem.Click += new System.EventHandler(this.매출내역ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 이용자거래처조회ToolStripMenuItem
|
// 이용자거래처조회ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.이용자거래처조회ToolStripMenuItem.Name = "이용자거래처조회ToolStripMenuItem";
|
this.이용자거래처조회ToolStripMenuItem.Name = "이용자거래처조회ToolStripMenuItem";
|
||||||
this.이용자거래처조회ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.이용자거래처조회ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
|
||||||
this.이용자거래처조회ToolStripMenuItem.Text = "이용자 거래처 조회";
|
this.이용자거래처조회ToolStripMenuItem.Text = "이용자 거래처 조회";
|
||||||
this.이용자거래처조회ToolStripMenuItem.Click += new System.EventHandler(this.이용자거래처조회ToolStripMenuItem_Click);
|
this.이용자거래처조회ToolStripMenuItem.Click += new System.EventHandler(this.이용자거래처조회ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 마크설정ToolStripMenuItem
|
// 마크설정ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.마크설정ToolStripMenuItem.Name = "마크설정ToolStripMenuItem";
|
this.마크설정ToolStripMenuItem.Name = "마크설정ToolStripMenuItem";
|
||||||
this.마크설정ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.마크설정ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
|
||||||
this.마크설정ToolStripMenuItem.Text = "마크설정";
|
this.마크설정ToolStripMenuItem.Text = "마크설정";
|
||||||
this.마크설정ToolStripMenuItem.Click += new System.EventHandler(this.마크설정ToolStripMenuItem_Click);
|
this.마크설정ToolStripMenuItem.Click += new System.EventHandler(this.마크설정ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// 일괄처리관리ToolStripMenuItem
|
// 일괄처리관리ToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.일괄처리관리ToolStripMenuItem.Name = "일괄처리관리ToolStripMenuItem";
|
this.일괄처리관리ToolStripMenuItem.Name = "일괄처리관리ToolStripMenuItem";
|
||||||
this.일괄처리관리ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
|
this.일괄처리관리ToolStripMenuItem.Size = new System.Drawing.Size(178, 22);
|
||||||
this.일괄처리관리ToolStripMenuItem.Text = "일괄처리 관리";
|
this.일괄처리관리ToolStripMenuItem.Text = "일괄처리 관리";
|
||||||
this.일괄처리관리ToolStripMenuItem.Click += new System.EventHandler(this.일괄처리관리ToolStripMenuItem_Click);
|
this.일괄처리관리ToolStripMenuItem.Click += new System.EventHandler(this.일괄처리관리ToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
@@ -1008,7 +1011,8 @@
|
|||||||
this.botUserLabel,
|
this.botUserLabel,
|
||||||
this.toolStripSeparator2,
|
this.toolStripSeparator2,
|
||||||
this.toolStripSeparator3,
|
this.toolStripSeparator3,
|
||||||
this.IPText});
|
this.IPText,
|
||||||
|
this.lblStatus});
|
||||||
this.toolStrip1.Location = new System.Drawing.Point(0, 681);
|
this.toolStrip1.Location = new System.Drawing.Point(0, 681);
|
||||||
this.toolStrip1.Name = "toolStrip1";
|
this.toolStrip1.Name = "toolStrip1";
|
||||||
this.toolStrip1.Size = new System.Drawing.Size(1259, 25);
|
this.toolStrip1.Size = new System.Drawing.Size(1259, 25);
|
||||||
@@ -1057,6 +1061,19 @@
|
|||||||
this.IPText.Size = new System.Drawing.Size(154, 22);
|
this.IPText.Size = new System.Drawing.Size(154, 22);
|
||||||
this.IPText.Text = "접속 아이피 : 0.000.00.000";
|
this.IPText.Text = "접속 아이피 : 0.000.00.000";
|
||||||
//
|
//
|
||||||
|
// lblStatus
|
||||||
|
//
|
||||||
|
this.lblStatus.Name = "lblStatus";
|
||||||
|
this.lblStatus.Size = new System.Drawing.Size(27, 22);
|
||||||
|
this.lblStatus.Text = "WD";
|
||||||
|
//
|
||||||
|
// 복본조사2
|
||||||
|
//
|
||||||
|
this.복본조사2.Name = "복본조사2";
|
||||||
|
this.복본조사2.Size = new System.Drawing.Size(180, 22);
|
||||||
|
this.복본조사2.Text = "복본조사(New)";
|
||||||
|
this.복본조사2.Click += new System.EventHandler(this.복본조사2_Click);
|
||||||
|
//
|
||||||
// Main
|
// Main
|
||||||
//
|
//
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||||
@@ -1188,5 +1205,7 @@
|
|||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
|
||||||
public System.Windows.Forms.ToolStripLabel IPText;
|
public System.Windows.Forms.ToolStripLabel IPText;
|
||||||
|
private System.Windows.Forms.ToolStripLabel lblStatus;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem 복본조사2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,7 @@ using UniMarc.마크;
|
|||||||
using UniMarc.Properties;
|
using UniMarc.Properties;
|
||||||
using UniMarc;
|
using UniMarc;
|
||||||
|
|
||||||
|
|
||||||
namespace WindowsFormsApp1
|
namespace WindowsFormsApp1
|
||||||
{
|
{
|
||||||
public partial class Main : Form
|
public partial class Main : Form
|
||||||
@@ -40,6 +41,7 @@ namespace WindowsFormsApp1
|
|||||||
public Main()
|
public Main()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
PUB.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string User_Name { get; internal set; }
|
public string User_Name { get; internal set; }
|
||||||
@@ -48,13 +50,7 @@ namespace WindowsFormsApp1
|
|||||||
{
|
{
|
||||||
this.Visible = false; // 메인폼을 먼저 숨김
|
this.Visible = false; // 메인폼을 먼저 숨김
|
||||||
|
|
||||||
#region "Log setting"
|
|
||||||
var logsubdir = "{yyyy|MM|dd}";
|
|
||||||
string tPath = string.Format("{0}\\LOG", AppDomain.CurrentDomain.BaseDirectory).Replace("\\\\", "\\"); ;
|
|
||||||
CUtill.mLog = new arUtil.Log(tPath);
|
|
||||||
CUtill.mLog.SubDirectory = logsubdir;
|
|
||||||
CUtill.mLog.FileNameFormat = "{yyMMdd}";
|
|
||||||
#endregion
|
|
||||||
login login = new login();
|
login login = new login();
|
||||||
VersionText.Text = string.Format("UniMarc Ver.{0}", ip.VersionInfo());
|
VersionText.Text = string.Format("UniMarc Ver.{0}", ip.VersionInfo());
|
||||||
|
|
||||||
@@ -99,9 +95,44 @@ namespace WindowsFormsApp1
|
|||||||
SetBtnName();
|
SetBtnName();
|
||||||
}
|
}
|
||||||
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
|
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
|
||||||
|
|
||||||
|
UpdaterCheck();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// factory client update checkd
|
||||||
|
/// </summary>
|
||||||
|
static void UpdaterCheck()
|
||||||
|
{
|
||||||
|
var fi = new System.IO.FileInfo("_Factory_Client.exe");
|
||||||
|
var fio = new System.IO.FileInfo("Factory_Client.exe");
|
||||||
|
if (fi.Exists)
|
||||||
|
{
|
||||||
|
if (fio.Exists == false)
|
||||||
|
{
|
||||||
|
fi.CopyTo(fio.FullName);
|
||||||
|
fio.LastWriteTime = fi.LastWriteTime;
|
||||||
|
fio.LastAccessTime = fi.LastAccessTime;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//check size
|
||||||
|
if (fi.Length != fio.Length || fi.LastWriteTime != fio.LastWriteTime)
|
||||||
|
{
|
||||||
|
fi.CopyTo(fio.FullName, true);
|
||||||
|
fio.LastWriteTime = fi.LastWriteTime;
|
||||||
|
fio.LastAccessTime = fi.LastAccessTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Console.WriteLine("updater patch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region 즐겨찾기 버튼 세팅
|
#region 즐겨찾기 버튼 세팅
|
||||||
public void SetBtnName()
|
public void SetBtnName()
|
||||||
{
|
{
|
||||||
@@ -216,7 +247,7 @@ namespace WindowsFormsApp1
|
|||||||
"마크통계", "장비관리" };
|
"마크통계", "장비관리" };
|
||||||
ToolStripMenuItem[] MarcT = {
|
ToolStripMenuItem[] MarcT = {
|
||||||
마크작성, 마크목록, 소장자료검색, 마크정리, iSBN조회, 목록, 편목, 마크반입,
|
마크작성, 마크목록, 소장자료검색, 마크정리, iSBN조회, 목록, 편목, 마크반입,
|
||||||
마크반출, 복본조사1, dLS복본조사, 마크수집, 전집관리,
|
마크반출, 복본조사1, 복본조사2, dLS복본조사, 마크수집, 전집관리,
|
||||||
검수, 저자기호, DLS조회, 서류작성,
|
검수, 저자기호, DLS조회, 서류작성,
|
||||||
마크통계, 장비관리
|
마크통계, 장비관리
|
||||||
};
|
};
|
||||||
@@ -1161,7 +1192,7 @@ namespace WindowsFormsApp1
|
|||||||
{
|
{
|
||||||
Mac_dLS_Copy = new DLS_Copy(this);
|
Mac_dLS_Copy = new DLS_Copy(this);
|
||||||
Mac_dLS_Copy.MdiParent = this;
|
Mac_dLS_Copy.MdiParent = this;
|
||||||
Mac_dLS_Copy.WindowState = FormWindowState.Maximized;
|
//Mac_dLS_Copy.WindowState = FormWindowState.Maximized;
|
||||||
Mac_dLS_Copy.FormClosed += (o, ea) => Mac_dLS_Copy = null;
|
Mac_dLS_Copy.FormClosed += (o, ea) => Mac_dLS_Copy = null;
|
||||||
Mac_dLS_Copy.Show();
|
Mac_dLS_Copy.Show();
|
||||||
}
|
}
|
||||||
@@ -1502,5 +1533,14 @@ namespace WindowsFormsApp1
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void 복본조사2_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var Mac_check_Copy = new Check_copyWD(this);
|
||||||
|
Mac_check_Copy.MdiParent = this;
|
||||||
|
Mac_check_Copy.WindowState = FormWindowState.Normal;
|
||||||
|
Mac_check_Copy.FormClosed += (o, ea) => Mac_check_Copy = null;
|
||||||
|
Mac_check_Copy.Show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
26
unimarc/unimarc/PUB.cs
Normal file
26
unimarc/unimarc/PUB.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace UniMarc
|
||||||
|
{
|
||||||
|
public static class PUB
|
||||||
|
{
|
||||||
|
public static arUtil.Log log;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
#region "Log setting"
|
||||||
|
var logsubdir = "{yyyy|MM|dd}";
|
||||||
|
string tPath = string.Format("{0}\\LOG", AppDomain.CurrentDomain.BaseDirectory).Replace("\\\\", "\\"); ;
|
||||||
|
PUB.log = new arUtil.Log(tPath);
|
||||||
|
PUB.log.SubDirectory = logsubdir;
|
||||||
|
PUB.log.FileNameFormat = "{yyMMdd}";
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,39 +16,25 @@ namespace WindowsFormsApp1
|
|||||||
{
|
{
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
//AR.UTIL.MsgE("unitmarc");
|
||||||
|
try
|
||||||
|
{
|
||||||
DB_InitSetting();
|
DB_InitSetting();
|
||||||
UpdaterCheck();
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show(ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
Application.Run(new Main());
|
Application.Run(new Main());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// factory client update checkd
|
|
||||||
/// </summary>
|
|
||||||
static void UpdaterCheck()
|
|
||||||
{
|
|
||||||
var fi = new System.IO.FileInfo("_Factory_Client.exe");
|
|
||||||
var fio = new System.IO.FileInfo("Factory_Client.exe");
|
|
||||||
if (fi.Exists)
|
|
||||||
{
|
|
||||||
if (fio.Exists == false)
|
|
||||||
{
|
|
||||||
fi.CopyTo(fio.FullName);
|
|
||||||
fio.LastWriteTime = fi.LastWriteTime;
|
|
||||||
fio.LastAccessTime = fi.LastAccessTime;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//check size
|
|
||||||
if(fi.Length != fio.Length || fi.LastWriteTime != fio.LastWriteTime)
|
|
||||||
{
|
|
||||||
fi.CopyTo(fio.FullName,true);
|
|
||||||
fio.LastWriteTime = fi.LastWriteTime;
|
|
||||||
fio.LastAccessTime = fi.LastAccessTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Console.WriteLine("updater patch");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void DB_InitSetting()
|
static void DB_InitSetting()
|
||||||
{
|
{
|
||||||
UniMarc.Properties.Settings.Default.IP = ConvertIP(UniMarc.Properties.Settings.Default.IP);
|
UniMarc.Properties.Settings.Default.IP = ConvertIP(UniMarc.Properties.Settings.Default.IP);
|
||||||
|
|||||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
|
// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호를
|
||||||
// 기본값으로 할 수 있습니다.
|
// 기본값으로 할 수 있습니다.
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.185")]
|
[assembly: AssemblyVersion("1.0.187.3")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.185")]
|
[assembly: AssemblyFileVersion("1.0.187.3")]
|
||||||
|
|||||||
68
unimarc/unimarc/SearchModel/BookSearchService.cs
Normal file
68
unimarc/unimarc/SearchModel/BookSearchService.cs
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
public class BookSearchResult
|
||||||
|
{
|
||||||
|
public string SiteName { get; set; }
|
||||||
|
public int BookCount { get; set; }
|
||||||
|
public string SearchTerm { get; set; }
|
||||||
|
public DateTime SearchTime { get; set; }
|
||||||
|
public string ErrorMessage { get; set; }
|
||||||
|
public bool IsSuccess { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BookSearchService
|
||||||
|
{
|
||||||
|
private readonly List<ILibrarySearcher> _searchers;
|
||||||
|
|
||||||
|
public BookSearchService()
|
||||||
|
{
|
||||||
|
_searchers = new List<ILibrarySearcher>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return Searcher
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="no"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public ILibrarySearcher Get(int no)
|
||||||
|
{
|
||||||
|
return _searchers.Where(t => t.No == no).FirstOrDefault();
|
||||||
|
}
|
||||||
|
public void AddSearcher(ILibrarySearcher searcher)
|
||||||
|
{
|
||||||
|
if (!_searchers.Any(s => s.SiteName == searcher.SiteName))
|
||||||
|
{
|
||||||
|
_searchers.Add(searcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveSearcher(string siteName)
|
||||||
|
{
|
||||||
|
var searcher = _searchers.FirstOrDefault(s => s.SiteName == siteName);
|
||||||
|
if (searcher != null)
|
||||||
|
{
|
||||||
|
_searchers.Remove(searcher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> GetAvailableSites()
|
||||||
|
{
|
||||||
|
return _searchers.Select(s => s.SiteName).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearSearchers()
|
||||||
|
{
|
||||||
|
_searchers.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
781
unimarc/unimarc/SearchModel/ChromeDriverManager.cs
Normal file
781
unimarc/unimarc/SearchModel/ChromeDriverManager.cs
Normal file
@@ -0,0 +1,781 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using WebDriverManager;
|
||||||
|
using WebDriverManager.DriverConfigs.Impl;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Principal;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Chrome;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
public static class ChromeDriverManager
|
||||||
|
{
|
||||||
|
private static string _driverPath = null;
|
||||||
|
private static readonly object _lockObject = new object();
|
||||||
|
private static readonly int MaxRetryCount = 3;
|
||||||
|
private static readonly int RetryDelayMs = 2000;
|
||||||
|
private static readonly string UserDataDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ChromeDriverUserData");
|
||||||
|
|
||||||
|
public static async Task<string> SetupChromeDriverAsync(DownloadProgressForm progressForm = null)
|
||||||
|
{
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_driverPath) && File.Exists(_driverPath))
|
||||||
|
{
|
||||||
|
// 이미 설정된 드라이버가 있고 정상 동작하면 재사용
|
||||||
|
if (IsDriverReady())
|
||||||
|
{
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(100, "기존 드라이버 사용");
|
||||||
|
progressForm.SetCompleted("기존 드라이버를 사용합니다.");
|
||||||
|
}
|
||||||
|
return _driverPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Chrome 설치 여부 확인
|
||||||
|
if (!IsChromeInstalled())
|
||||||
|
{
|
||||||
|
var errorMsg = "Chrome이 설치되어 있지 않습니다. Chrome을 설치한 후 다시 시도해주세요.";
|
||||||
|
Console.WriteLine(errorMsg);
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.SetError(errorMsg);
|
||||||
|
}
|
||||||
|
throw new InvalidOperationException(errorMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 사용자 데이터 디렉토리 생성
|
||||||
|
EnsureUserDataDirectory();
|
||||||
|
|
||||||
|
// 사용자 디렉토리 생성 후 기존 Chrome/ChromeDriver 프로세스 정리
|
||||||
|
CleanupChromeProcesses();
|
||||||
|
|
||||||
|
// Chrome 버전 확인
|
||||||
|
var chromeVersion = GetChromeVersion();
|
||||||
|
Console.WriteLine($"설치된 Chrome 버전: {chromeVersion}");
|
||||||
|
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(10, $"Chrome 버전 확인 중... ({chromeVersion})");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기존 드라이버 경로 확인
|
||||||
|
var existingDriverPath = GetExistingDriverPath();
|
||||||
|
if (!string.IsNullOrEmpty(existingDriverPath) && File.Exists(existingDriverPath))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"기존 드라이버 발견: {existingDriverPath}");
|
||||||
|
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(20, "기존 드라이버 테스트 중...");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기존 드라이버 테스트 (한 번만)
|
||||||
|
if (await TestExistingDriver(existingDriverPath))
|
||||||
|
{
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(100, "기존 드라이버 사용");
|
||||||
|
progressForm.SetCompleted("기존 드라이버를 사용합니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_driverPath = existingDriverPath;
|
||||||
|
Environment.SetEnvironmentVariable("webdriver.chrome.driver", existingDriverPath);
|
||||||
|
}
|
||||||
|
return existingDriverPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("기존 드라이버 테스트 실패 - 새로 다운로드");
|
||||||
|
// 기존 드라이버 삭제
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(existingDriverPath);
|
||||||
|
Console.WriteLine("기존 드라이버 삭제됨");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"기존 드라이버 삭제 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 드라이버 다운로드
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(30, "Chrome 드라이버 다운로드 중...");
|
||||||
|
}
|
||||||
|
var driverPath = await DownloadChromeDriverWithRetryAsync(progressForm);
|
||||||
|
|
||||||
|
// 다운로드된 드라이버 테스트 (한 번만)
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(80, "다운로드된 드라이버 테스트 중...");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await TestExistingDriver(driverPath))
|
||||||
|
{
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_driverPath = driverPath;
|
||||||
|
Environment.SetEnvironmentVariable("webdriver.chrome.driver", driverPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(100, "드라이버 설정 완료");
|
||||||
|
progressForm.SetCompleted("드라이버 설정 완료!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine($"ChromeDriver 경로: {driverPath}");
|
||||||
|
Console.WriteLine($"환경 변수 설정: webdriver.chrome.driver = {driverPath}");
|
||||||
|
|
||||||
|
return driverPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("다운로드된 드라이버 테스트에 실패했습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var errorMsg = $"ChromeDriver 설정 오류: {ex.Message}";
|
||||||
|
Console.WriteLine(errorMsg);
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.SetError(errorMsg);
|
||||||
|
}
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void EnsureUserDataDirectory()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(UserDataDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(UserDataDir);
|
||||||
|
Console.WriteLine($"사용자 데이터 디렉토리 생성: {UserDataDir}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 임시 파일 디렉토리도 생성
|
||||||
|
var tempDir = Path.Combine(UserDataDir, "temp");
|
||||||
|
if (!Directory.Exists(tempDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(tempDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 로그 디렉토리 생성
|
||||||
|
var logDir = Path.Combine(UserDataDir, "logs");
|
||||||
|
if (!Directory.Exists(logDir))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(logDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"사용자 데이터 디렉토리 생성 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<string> DownloadChromeDriverWithRetryAsync(DownloadProgressForm progressForm)
|
||||||
|
{
|
||||||
|
Exception lastException = null;
|
||||||
|
|
||||||
|
for (int attempt = 1; attempt <= MaxRetryCount; attempt++)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(30 + (attempt - 1) * 10,
|
||||||
|
$"Chrome 드라이버 다운로드 중... (시도 {attempt}/{MaxRetryCount})");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine($"드라이버 다운로드 시도 {attempt}/{MaxRetryCount}");
|
||||||
|
|
||||||
|
// WebDriverManager를 사용하여 설치된 Chrome 버전에 맞는 드라이버 다운로드
|
||||||
|
var driverManager = new DriverManager();
|
||||||
|
var driverPath = driverManager.SetUpDriver(new ChromeConfig(), "MatchingBrowser");
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(driverPath) && File.Exists(driverPath))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"드라이버 다운로드 성공: {driverPath}");
|
||||||
|
return driverPath;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("드라이버 파일을 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
lastException = ex;
|
||||||
|
Console.WriteLine($"드라이버 다운로드 시도 {attempt} 실패: {ex.Message}");
|
||||||
|
|
||||||
|
if (attempt < MaxRetryCount)
|
||||||
|
{
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(30 + attempt * 10,
|
||||||
|
$"다운로드 실패. 재시도 중... ({attempt + 1}/{MaxRetryCount})");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 재시도 전 잠시 대기
|
||||||
|
await Task.Delay(RetryDelayMs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InvalidOperationException($"드라이버 다운로드를 {MaxRetryCount}번 시도했지만 실패했습니다. 마지막 오류: {lastException?.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetExistingDriverPath()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 환경 변수에서 확인
|
||||||
|
var envPath = Environment.GetEnvironmentVariable("webdriver.chrome.driver");
|
||||||
|
if (!string.IsNullOrEmpty(envPath) && File.Exists(envPath))
|
||||||
|
{
|
||||||
|
return envPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 사용자 디렉토리에서 확인 (관리자 권한 없이도 접근 가능)
|
||||||
|
var userDriverPath = Path.Combine(UserDataDir, "chromedriver.exe");
|
||||||
|
if (File.Exists(userDriverPath))
|
||||||
|
{
|
||||||
|
return userDriverPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebDriverManager 캐시 폴더에서 확인
|
||||||
|
var cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||||
|
".cache", "selenium");
|
||||||
|
if (Directory.Exists(cachePath))
|
||||||
|
{
|
||||||
|
var chromeDriverFiles = Directory.GetFiles(cachePath, "chromedriver*", SearchOption.AllDirectories)
|
||||||
|
.Where(f => f.EndsWith(".exe") || !Path.HasExtension(f))
|
||||||
|
.OrderByDescending(f => File.GetLastWriteTime(f))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
if (chromeDriverFiles.Length > 0)
|
||||||
|
{
|
||||||
|
return chromeDriverFiles[0]; // 가장 최근 파일 반환
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 현재 실행 파일과 같은 디렉토리에서 확인
|
||||||
|
var currentDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||||
|
if (!string.IsNullOrEmpty(currentDir))
|
||||||
|
{
|
||||||
|
var localDriverPath = Path.Combine(currentDir, "chromedriver.exe");
|
||||||
|
if (File.Exists(localDriverPath))
|
||||||
|
{
|
||||||
|
return localDriverPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"기존 드라이버 경로 확인 실패: {ex.Message}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetDriverPath()
|
||||||
|
{
|
||||||
|
return _driverPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetChromeVersion()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Windows에서 Chrome 설치 경로 확인
|
||||||
|
var chromePaths = new[]
|
||||||
|
{
|
||||||
|
@"C:\Program Files\Google\Chrome\Application\chrome.exe",
|
||||||
|
@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
@"Google\Chrome\Application\chrome.exe"),
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
|
||||||
|
@"Google\Chrome\Application\chrome.exe"),
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
|
||||||
|
@"Google\Chrome\Application\chrome.exe")
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var path in chromePaths)
|
||||||
|
{
|
||||||
|
if (File.Exists(path))
|
||||||
|
{
|
||||||
|
var versionInfo = FileVersionInfo.GetVersionInfo(path);
|
||||||
|
var version = versionInfo.FileVersion;
|
||||||
|
Console.WriteLine($"Chrome 버전 감지: {version} (경로: {path})");
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 레지스트리에서 확인 (추가 방법)
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Google\Chrome\BLBeacon"))
|
||||||
|
{
|
||||||
|
if (key != null)
|
||||||
|
{
|
||||||
|
var version = key.GetValue("version") as string;
|
||||||
|
if (!string.IsNullOrEmpty(version))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"레지스트리에서 Chrome 버전 감지: {version}");
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"레지스트리 확인 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return "알 수 없음";
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Chrome 버전 감지 실패: {ex.Message}");
|
||||||
|
return "확인 실패";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsChromeInstalled()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var chromePaths = new[]
|
||||||
|
{
|
||||||
|
@"C:\Program Files\Google\Chrome\Application\chrome.exe",
|
||||||
|
@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe",
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
@"Google\Chrome\Application\chrome.exe"),
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
|
||||||
|
@"Google\Chrome\Application\chrome.exe"),
|
||||||
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
|
||||||
|
@"Google\Chrome\Application\chrome.exe")
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var path in chromePaths)
|
||||||
|
{
|
||||||
|
if (File.Exists(path))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 레지스트리에서도 확인
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Google\Chrome\BLBeacon"))
|
||||||
|
{
|
||||||
|
if (key != null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// 레지스트리 접근 실패는 무시
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Chrome 설치 확인 실패: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<bool> TestChromeDriverAsync(DownloadProgressForm progressForm = null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var driverPath = await SetupChromeDriverAsync(progressForm);
|
||||||
|
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.UpdateProgress(50, "드라이버 테스트 중...");
|
||||||
|
}
|
||||||
|
|
||||||
|
return await TestExistingDriver(driverPath);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ChromeDriver 테스트 실패: {ex.Message}");
|
||||||
|
if (progressForm != null)
|
||||||
|
{
|
||||||
|
progressForm.SetError($"테스트 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ClearDriverCache()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine("Chrome 드라이버 캐시 정리 시작...");
|
||||||
|
|
||||||
|
// 사용자 데이터 디렉토리 정리
|
||||||
|
if (Directory.Exists(UserDataDir))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(UserDataDir, true);
|
||||||
|
Console.WriteLine($"사용자 데이터 디렉토리 정리됨: {UserDataDir}");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"사용자 데이터 디렉토리 정리 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebDriverManager 캐시 폴더 정리
|
||||||
|
var cachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
|
||||||
|
".cache", "selenium");
|
||||||
|
if (Directory.Exists(cachePath))
|
||||||
|
{
|
||||||
|
Directory.Delete(cachePath, true);
|
||||||
|
Console.WriteLine($"WebDriverManager 캐시 정리됨: {cachePath}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 환경 변수에서 설정된 드라이버 경로도 정리
|
||||||
|
var envDriverPath = Environment.GetEnvironmentVariable("webdriver.chrome.driver");
|
||||||
|
if (!string.IsNullOrEmpty(envDriverPath) && File.Exists(envDriverPath))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(envDriverPath);
|
||||||
|
Console.WriteLine($"환경 변수 드라이버 삭제됨: {envDriverPath}");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"환경 변수 드라이버 삭제 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 저장된 드라이버 경로도 정리
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_driverPath) && File.Exists(_driverPath))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(_driverPath);
|
||||||
|
Console.WriteLine($"저장된 드라이버 삭제됨: {_driverPath}");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"저장된 드라이버 삭제 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_driverPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment.SetEnvironmentVariable("webdriver.chrome.driver", null);
|
||||||
|
|
||||||
|
Console.WriteLine("Chrome 드라이버 캐시 정리 완료");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"캐시 정리 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsDriverReady()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var driverPath = GetExistingDriverPath();
|
||||||
|
if (string.IsNullOrEmpty(driverPath) || !File.Exists(driverPath))
|
||||||
|
{
|
||||||
|
Console.WriteLine("기존 드라이버가 없습니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine($"드라이버 준비 상태 확인: {driverPath}");
|
||||||
|
|
||||||
|
// 파일 크기와 수정 날짜로 기본 검증
|
||||||
|
var fileInfo = new FileInfo(driverPath);
|
||||||
|
if (fileInfo.Length < 1000) // 1KB 미만이면 의심스러움
|
||||||
|
{
|
||||||
|
Console.WriteLine("드라이버 파일이 너무 작습니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 최근 30일 내 파일인지 확인
|
||||||
|
if (fileInfo.LastWriteTime < DateTime.Now.AddDays(-30))
|
||||||
|
{
|
||||||
|
Console.WriteLine("드라이버 파일이 너무 오래되었습니다.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("드라이버 준비 상태: 준비됨");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"드라이버 준비 상태 확인 실패: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 기본 Chrome 옵션을 생성하는 헬퍼 메서드
|
||||||
|
/// </summary>
|
||||||
|
public static ChromeOptions CreateBaseChromeOptions(bool hideBrowser = true,int width = 800,int height = 600)
|
||||||
|
{
|
||||||
|
var options = new ChromeOptions();
|
||||||
|
|
||||||
|
if (hideBrowser)
|
||||||
|
{
|
||||||
|
options.AddArgument("--headless");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(width > 0 && height > 0)
|
||||||
|
{
|
||||||
|
options.AddArgument($"--window-size={width},{height}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 기본 안정성 옵션
|
||||||
|
options.AddArgument("--no-sandbox");
|
||||||
|
options.AddArgument("--remote-debugging-port=0");
|
||||||
|
options.AddArgument("--disable-extensions");
|
||||||
|
options.AddArgument("--disable-plugins");
|
||||||
|
options.AddArgument("--disable-images");
|
||||||
|
options.AddArgument("--disable-javascript");
|
||||||
|
options.AddArgument("--disable-java");
|
||||||
|
options.AddArgument("--disable-flash");
|
||||||
|
options.AddArgument("--disable-web-security");
|
||||||
|
options.AddArgument("--allow-running-insecure-content");
|
||||||
|
|
||||||
|
// 메모리 및 성능 최적화
|
||||||
|
options.AddArgument("--memory-pressure-off");
|
||||||
|
options.AddArgument("--max_old_space_size=4096");
|
||||||
|
options.AddArgument("--disable-background-timer-throttling");
|
||||||
|
options.AddArgument("--disable-backgrounding-occluded-windows");
|
||||||
|
options.AddArgument("--disable-renderer-backgrounding");
|
||||||
|
options.AddArgument("--disable-features=TranslateUI");
|
||||||
|
options.AddArgument("--disable-ipc-flooding-protection");
|
||||||
|
options.AddArgument("--disable-default-apps");
|
||||||
|
options.AddArgument("--disable-sync");
|
||||||
|
options.AddArgument("--disable-translate");
|
||||||
|
options.AddArgument("--disable-logging");
|
||||||
|
options.AddArgument("--disable-notifications");
|
||||||
|
options.AddArgument("--disable-popup-blocking");
|
||||||
|
options.AddArgument("--disable-prompt-on-repost");
|
||||||
|
options.AddArgument("--disable-hang-monitor");
|
||||||
|
options.AddArgument("--disable-client-side-phishing-detection");
|
||||||
|
options.AddArgument("--disable-component-update");
|
||||||
|
options.AddArgument("--disable-domain-reliability");
|
||||||
|
|
||||||
|
// 프로세스 관련 안정성 옵션
|
||||||
|
options.AddArgument("--single-process");
|
||||||
|
options.AddArgument("--no-zygote");
|
||||||
|
options.AddArgument("--disable-background-networking");
|
||||||
|
|
||||||
|
// 캐시 및 저장소 비활성화
|
||||||
|
options.AddArgument("--disable-application-cache");
|
||||||
|
options.AddArgument("--disable-offline-load-stale-cache");
|
||||||
|
options.AddArgument("--disk-cache-size=0");
|
||||||
|
options.AddArgument("--media-cache-size=0");
|
||||||
|
options.AddArgument("--aggressive-cache-discard");
|
||||||
|
options.AddArgument("--enable-aggressive-domstorage-flushing");
|
||||||
|
|
||||||
|
// 기타 안정성 옵션
|
||||||
|
options.AddArgument("--enable-low-end-device-mode");
|
||||||
|
options.AddArgument("--force-fieldtrials=*BackgroundTracing/default/");
|
||||||
|
|
||||||
|
// 사용자 데이터 디렉토리 설정 (관리자 권한 없이도 접근 가능)
|
||||||
|
options.AddArgument($"--user-data-dir={UserDataDir}");
|
||||||
|
options.AddArgument("--no-first-run");
|
||||||
|
options.AddArgument("--no-default-browser-check");
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 검색 최적화된 Chrome 옵션을 반환합니다
|
||||||
|
/// </summary>
|
||||||
|
public static ChromeOptions GetSearchOptimizedOptions()
|
||||||
|
{
|
||||||
|
var options = CreateBaseChromeOptions(true);
|
||||||
|
|
||||||
|
// 검색에 필요한 기능만 활성화
|
||||||
|
options.AddArgument("--enable-javascript");
|
||||||
|
options.AddArgument("--enable-images");
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<bool> TestExistingDriver(string driverPath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine($"드라이버 테스트: {driverPath}");
|
||||||
|
|
||||||
|
// ChromeDriver 서비스 설정
|
||||||
|
var service = OpenQA.Selenium.Chrome.ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath));
|
||||||
|
service.HideCommandPromptWindow = true;
|
||||||
|
|
||||||
|
// 기본 Chrome 옵션 사용하고 테스트용 추가 옵션 설정
|
||||||
|
var options = CreateBaseChromeOptions(true);
|
||||||
|
|
||||||
|
// 테스트용 추가 옵션들
|
||||||
|
options.AddArgument("--log-level=3"); // 오류만 표시
|
||||||
|
options.AddArgument("--silent");
|
||||||
|
options.AddArgument("--window-size=1920,1080");
|
||||||
|
options.AddArgument("--start-maximized");
|
||||||
|
options.AddArgument("--disable-blink-features=AutomationControlled");
|
||||||
|
options.AddArgument("--enable-aggressive-domstorage-flushing");
|
||||||
|
|
||||||
|
using (var driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options))
|
||||||
|
{
|
||||||
|
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(15);
|
||||||
|
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
|
||||||
|
|
||||||
|
driver.Navigate().GoToUrl("https://www.google.com");
|
||||||
|
var title = driver.Title;
|
||||||
|
Console.WriteLine($"드라이버 테스트 성공: {title}");
|
||||||
|
return !string.IsNullOrEmpty(title);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"드라이버 테스트 실패: {ex.Message}");
|
||||||
|
|
||||||
|
// DevToolsActivePort 및 Chrome 크래시 관련 특별 처리
|
||||||
|
if (ex.Message.Contains("DevToolsActivePort file doesn't exist") ||
|
||||||
|
ex.Message.Contains("was killed") ||
|
||||||
|
ex.Message.Contains("Chrome has crashed"))
|
||||||
|
{
|
||||||
|
Console.WriteLine("DevToolsActivePort 또는 Chrome 크래시 감지됨. 사용자 데이터 디렉토리 정리 시도...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 사용자 데이터 디렉토리 정리
|
||||||
|
if (Directory.Exists(UserDataDir))
|
||||||
|
{
|
||||||
|
Directory.Delete(UserDataDir, true);
|
||||||
|
Console.WriteLine("사용자 데이터 디렉토리 정리 완료");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chrome 프로세스 정리 시도
|
||||||
|
CleanupChromeProcesses();
|
||||||
|
|
||||||
|
// 잠시 대기
|
||||||
|
await Task.Delay(1000);
|
||||||
|
}
|
||||||
|
catch (Exception cleanupEx)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"사용자 데이터 디렉토리 정리 실패: {cleanupEx.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Chrome 프로세스 정리 메서드 추가
|
||||||
|
private static void CleanupChromeProcesses()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine("Chrome 프로세스 정리 시작...");
|
||||||
|
|
||||||
|
// Chrome 관련 프로세스들 찾기
|
||||||
|
var chromeProcesses = System.Diagnostics.Process.GetProcessesByName("chrome");
|
||||||
|
var chromedriverProcesses = System.Diagnostics.Process.GetProcessesByName("chromedriver");
|
||||||
|
|
||||||
|
// Chrome 프로세스 정리
|
||||||
|
bool KILLPROC = false;
|
||||||
|
foreach (var process in chromeProcesses)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!process.HasExited)
|
||||||
|
{
|
||||||
|
KILLPROC = true;
|
||||||
|
process.Kill();
|
||||||
|
Console.WriteLine($"Chrome 프로세스 종료: PID {process.Id}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Chrome 프로세스 종료 실패 (PID {process.Id}): {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChromeDriver 프로세스 정리
|
||||||
|
foreach (var process in chromedriverProcesses)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!process.HasExited)
|
||||||
|
{
|
||||||
|
KILLPROC = true;
|
||||||
|
process.Kill();
|
||||||
|
Console.WriteLine($"ChromeDriver 프로세스 종료: PID {process.Id}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ChromeDriver 프로세스 종료 실패 (PID {process.Id}): {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 잠시 대기하여 프로세스 완전 종료 확인
|
||||||
|
if(KILLPROC)
|
||||||
|
System.Threading.Thread.Sleep(2000);
|
||||||
|
|
||||||
|
Console.WriteLine("Chrome 프로세스 정리 완료");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Chrome 프로세스 정리 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Dispose()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
lock (_lockObject)
|
||||||
|
{
|
||||||
|
_driverPath = null;
|
||||||
|
}
|
||||||
|
Environment.SetEnvironmentVariable("webdriver.chrome.driver", null);
|
||||||
|
Console.WriteLine("ChromeDriverManager 리소스 해제 완료");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ChromeDriverManager 리소스 해제 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
142
unimarc/unimarc/SearchModel/DownloadProgressForm.cs
Normal file
142
unimarc/unimarc/SearchModel/DownloadProgressForm.cs
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
public partial class DownloadProgressForm : Form
|
||||||
|
{
|
||||||
|
private ProgressBar progressBar;
|
||||||
|
private Label lblStatus;
|
||||||
|
private Label lblProgress;
|
||||||
|
private Button btnCancel;
|
||||||
|
private bool isCancelled = false;
|
||||||
|
|
||||||
|
public DownloadProgressForm()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
this.StartPosition = FormStartPosition.CenterScreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
this.Text = "Chrome 드라이버 다운로드";
|
||||||
|
this.Size = new Size(400, 150);
|
||||||
|
this.StartPosition = FormStartPosition.CenterParent;
|
||||||
|
this.FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||||
|
this.MaximizeBox = false;
|
||||||
|
this.MinimizeBox = false;
|
||||||
|
this.ControlBox = false;
|
||||||
|
this.TopMost = true;
|
||||||
|
|
||||||
|
// 상태 라벨
|
||||||
|
lblStatus = new Label
|
||||||
|
{
|
||||||
|
Text = "Chrome 드라이버를 확인하고 있습니다...",
|
||||||
|
Location = new Point(20, 20),
|
||||||
|
Size = new Size(360, 20),
|
||||||
|
Font = new Font("맑은 고딕", 9),
|
||||||
|
TextAlign = ContentAlignment.MiddleCenter
|
||||||
|
};
|
||||||
|
|
||||||
|
// 진행률 라벨
|
||||||
|
lblProgress = new Label
|
||||||
|
{
|
||||||
|
Text = "0%",
|
||||||
|
Location = new Point(20, 50),
|
||||||
|
Size = new Size(360, 20),
|
||||||
|
Font = new Font("맑은 고딕", 10, FontStyle.Bold),
|
||||||
|
TextAlign = ContentAlignment.MiddleCenter,
|
||||||
|
ForeColor = Color.Blue
|
||||||
|
};
|
||||||
|
|
||||||
|
// 프로그레스 바
|
||||||
|
progressBar = new ProgressBar
|
||||||
|
{
|
||||||
|
Location = new Point(20, 80),
|
||||||
|
Size = new Size(360, 25),
|
||||||
|
Style = ProgressBarStyle.Continuous,
|
||||||
|
Minimum = 0,
|
||||||
|
Maximum = 100,
|
||||||
|
Value = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// 취소 버튼
|
||||||
|
btnCancel = new Button
|
||||||
|
{
|
||||||
|
Text = "취소",
|
||||||
|
Location = new Point(150, 115),
|
||||||
|
Size = new Size(100, 30),
|
||||||
|
Font = new Font("맑은 고딕", 9),
|
||||||
|
BackColor = Color.LightCoral
|
||||||
|
};
|
||||||
|
|
||||||
|
btnCancel.Click += BtnCancel_Click;
|
||||||
|
|
||||||
|
// 컨트롤 추가
|
||||||
|
this.Controls.AddRange(new Control[]
|
||||||
|
{
|
||||||
|
lblStatus, lblProgress, progressBar, btnCancel
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BtnCancel_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
isCancelled = true;
|
||||||
|
btnCancel.Enabled = false;
|
||||||
|
lblStatus.Text = "취소 중...";
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsCancelled => isCancelled;
|
||||||
|
|
||||||
|
public void UpdateProgress(int percentage, string status = null)
|
||||||
|
{
|
||||||
|
if (this.InvokeRequired)
|
||||||
|
{
|
||||||
|
this.Invoke(new Action<int, string>(UpdateProgress), percentage, status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
progressBar.Value = Math.Min(percentage, 100);
|
||||||
|
lblProgress.Text = $"{percentage}%";
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(status))
|
||||||
|
{
|
||||||
|
lblStatus.Text = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetCompleted(string message = "다운로드 완료!")
|
||||||
|
{
|
||||||
|
if (this.InvokeRequired)
|
||||||
|
{
|
||||||
|
this.Invoke(new Action<string>(SetCompleted), message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
progressBar.Value = 100;
|
||||||
|
lblProgress.Text = "100%";
|
||||||
|
lblStatus.Text = message;
|
||||||
|
btnCancel.Text = "확인";
|
||||||
|
btnCancel.BackColor = Color.LightGreen;
|
||||||
|
btnCancel.Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetError(string errorMessage)
|
||||||
|
{
|
||||||
|
if (this.InvokeRequired)
|
||||||
|
{
|
||||||
|
this.Invoke(new Action<string>(SetError), errorMessage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lblStatus.Text = "오류 발생";
|
||||||
|
lblProgress.Text = "실패";
|
||||||
|
lblProgress.ForeColor = Color.Red;
|
||||||
|
btnCancel.Text = "확인";
|
||||||
|
btnCancel.BackColor = Color.LightCoral;
|
||||||
|
btnCancel.Enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
unimarc/unimarc/SearchModel/ILibrarySearcher.cs
Normal file
23
unimarc/unimarc/SearchModel/ILibrarySearcher.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
using OpenQA.Selenium.Chrome;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Support.UI;
|
||||||
|
using System.IO;
|
||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Org.BouncyCastle.Bcpg;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
|
||||||
|
public interface ILibrarySearcher
|
||||||
|
{
|
||||||
|
int No { get; set; }
|
||||||
|
string SiteName { get; }
|
||||||
|
string SiteUrl { get; }
|
||||||
|
Task<BookSearchResult> SearchAsync(string searchTerm);
|
||||||
|
void StartDriver(bool showBrowser);
|
||||||
|
void StopDriver();
|
||||||
|
|
||||||
|
Task WaitForPageChange(WebDriverWait wait);
|
||||||
|
}
|
||||||
|
}
|
||||||
349
unimarc/unimarc/SearchModel/KwangjuCityLibrarySearcher.cs
Normal file
349
unimarc/unimarc/SearchModel/KwangjuCityLibrarySearcher.cs
Normal file
@@ -0,0 +1,349 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Chrome;
|
||||||
|
using OpenQA.Selenium.Support.UI;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using WebDriverManager;
|
||||||
|
using WebDriverManager.DriverConfigs.Impl;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
public class KwangjuCityLibrarySearcher_choisangjun : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_choisangjun(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "MF";
|
||||||
|
SiteName = "광주시교육청통합도서관(분관최상준도서관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class KwangjuCityLibrarySearcher_dagachi : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_dagachi(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "ME";
|
||||||
|
SiteName = "광주시교육청통합도서관(송정다가치문화도서관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class KwangjuCityLibrarySearcher_central : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_central(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "MD";
|
||||||
|
SiteName = "광주시교육청통합도서관(중앙도서관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class KwangjuCityLibrarySearcher_Student : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_Student(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "MC";
|
||||||
|
SiteName = "광주시교육청통합도서관(학생교육문화회관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class KwangjuCityLibrarySearcher_Kumho : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_Kumho(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "MB";
|
||||||
|
SiteName = "광주시교육청통합도서관(금호평생교육관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class KwangjuCityLibrarySearcher_Indi : KwangjuCityLibrarySearcher
|
||||||
|
{
|
||||||
|
public KwangjuCityLibrarySearcher_Indi(int no) : base(no)
|
||||||
|
{
|
||||||
|
SelectorValue = "MA";
|
||||||
|
SiteName = "광주시교육청통합도서관(학생독립운동기념회관)";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public abstract class KwangjuCityLibrarySearcher : ILibrarySearcher
|
||||||
|
{
|
||||||
|
public int No { get; set; }
|
||||||
|
public string SiteName { get; protected set; } = "광주시교육청통합도서관";
|
||||||
|
public string SiteUrl => "https://lib.gen.go.kr/main/site/search/bookSearch.do#simple";
|
||||||
|
|
||||||
|
protected string SelectorValue = "";
|
||||||
|
|
||||||
|
private ChromeDriver _driver;
|
||||||
|
private ChromeDriverService _service;
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
||||||
|
private const int SW_MINIMIZE = 6;
|
||||||
|
|
||||||
|
public KwangjuCityLibrarySearcher(int no)
|
||||||
|
{
|
||||||
|
this.No = no;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartDriver(bool showBrowser)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 동기적으로 실행 (권장하지 않음)
|
||||||
|
StartDriverAsync( showBrowser).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"StartDriver 실패: {ex.Message}");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StartDriverAsync( bool showdriver = false)
|
||||||
|
{
|
||||||
|
if (_driver == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// ChromeDriverManager를 사용하여 안정적으로 드라이버 설정
|
||||||
|
var driverPath = await ChromeDriverManager.SetupChromeDriverAsync();
|
||||||
|
|
||||||
|
// ChromeDriver 서비스 생성
|
||||||
|
_service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
|
||||||
|
_service.HideCommandPromptWindow = true;
|
||||||
|
|
||||||
|
// 안정적인 Chrome 옵션 가져오기 (브라우저 창 숨김)
|
||||||
|
var options = ChromeDriverManager.CreateBaseChromeOptions(!showdriver);
|
||||||
|
|
||||||
|
// 추가 보안 및 안정성 옵션
|
||||||
|
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
|
||||||
|
options.AddArgument("--disable-blink-features=AutomationControlled");
|
||||||
|
options.AddExcludedArgument("enable-automation");
|
||||||
|
options.AddAdditionalOption("useAutomationExtension", false);
|
||||||
|
|
||||||
|
// ChromeDriver 생성
|
||||||
|
_driver = new ChromeDriver(_service, options);
|
||||||
|
|
||||||
|
// 웹드라이버 감지 방지
|
||||||
|
((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
|
||||||
|
|
||||||
|
Console.WriteLine("NamguLibrarySearcher ChromeDriver 초기화 완료");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ChromeDriver 초기화 실패: {ex.Message}");
|
||||||
|
throw new InvalidOperationException($"ChromeDriver 초기화에 실패했습니다: {ex.Message}", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopDriver()
|
||||||
|
{
|
||||||
|
if (_driver != null)
|
||||||
|
{
|
||||||
|
_driver.Quit();
|
||||||
|
_driver.Dispose();
|
||||||
|
_driver = null;
|
||||||
|
}
|
||||||
|
if (_service != null)
|
||||||
|
{
|
||||||
|
_service.Dispose();
|
||||||
|
_service = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual protected void SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 콤보박스(select) 요소 찾기
|
||||||
|
var selectElement = wait.Until(d => d.FindElement(By.CssSelector("#manage_code")));
|
||||||
|
var select = new OpenQA.Selenium.Support.UI.SelectElement(selectElement);
|
||||||
|
|
||||||
|
// value가 "MA"인 옵션 선택
|
||||||
|
select.SelectByValue(SelectorValue);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// 예외 처리 (필요시 로깅 등)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<BookSearchResult> SearchAsync(string searchTerm)
|
||||||
|
{
|
||||||
|
var result = new BookSearchResult
|
||||||
|
{
|
||||||
|
SiteName = SiteName,
|
||||||
|
SearchTerm = searchTerm,
|
||||||
|
SearchTime = DateTime.Now
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (_driver == null)
|
||||||
|
throw new InvalidOperationException("드라이버가 시작되지 않았습니다. StartDriver()를 먼저 호출하세요.");
|
||||||
|
|
||||||
|
_driver.Navigate().GoToUrl(SiteUrl);
|
||||||
|
|
||||||
|
// 페이지 로딩 대기
|
||||||
|
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15));
|
||||||
|
|
||||||
|
// 모든 감지 방법이 끝나면 크롬창 최소화
|
||||||
|
// whale 브라우저가 최소화되어 우선해제
|
||||||
|
//IntPtr chromeWindow = FindWindow("Chrome_WidgetWin_1", null);
|
||||||
|
//if (chromeWindow != IntPtr.Zero)
|
||||||
|
//{
|
||||||
|
// ShowWindow(chromeWindow, SW_MINIMIZE);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//대상도서관 선택
|
||||||
|
SelectLibrary(wait);
|
||||||
|
|
||||||
|
// 검색창 찾기
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 여러 가능한 선택자 시도
|
||||||
|
var selectors = new[]
|
||||||
|
{
|
||||||
|
"input[id='search_txt']",
|
||||||
|
"input[type='text']",
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var selector in selectors)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
searchBox = wait.Until(d =>
|
||||||
|
{
|
||||||
|
var el = d.FindElement(By.CssSelector(selector));
|
||||||
|
return (el != null && el.Displayed && el.Enabled) ? el : null;
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchBox == null)
|
||||||
|
{
|
||||||
|
throw new Exception("검색창을 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception($"검색창 찾기 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 혹시 readonly라면 속성 제거
|
||||||
|
((IJavaScriptExecutor)_driver).ExecuteScript("arguments[0].removeAttribute('readonly')", searchBox);
|
||||||
|
|
||||||
|
// 입력 전 clear
|
||||||
|
searchBox.Clear();
|
||||||
|
searchBox.SendKeys(searchTerm);
|
||||||
|
|
||||||
|
// 검색 버튼 클릭
|
||||||
|
IWebElement searchButton = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var buttonSelectors = new[]
|
||||||
|
{
|
||||||
|
"input[type='submit']",
|
||||||
|
};
|
||||||
|
foreach (var selector in buttonSelectors)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
searchButton = _driver.FindElement(By.CssSelector(selector));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchButton == null)
|
||||||
|
{
|
||||||
|
// Enter 키로 검색 시도
|
||||||
|
searchBox.SendKeys(Keys.Enter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchButton.Click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Enter 키로 검색 시도
|
||||||
|
searchBox.SendKeys(Keys.Enter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 페이지 변경을 감지하는 메서드
|
||||||
|
await WaitForPageChange(new WebDriverWait(_driver, TimeSpan.FromSeconds(15)));
|
||||||
|
|
||||||
|
// 검색 결과 수 추출
|
||||||
|
var resultCount = ExtractBookCount(_driver);
|
||||||
|
|
||||||
|
result.BookCount = resultCount;
|
||||||
|
result.IsSuccess = true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSuccess = false;
|
||||||
|
result.ErrorMessage = ex.Message;
|
||||||
|
result.BookCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int ExtractBookCount(IWebDriver driver)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// div.search-result 내부의 span에서 '전체 N' 텍스트 추출
|
||||||
|
var resultDiv = driver.FindElement(By.CssSelector("div.ndls_result"));
|
||||||
|
var span = resultDiv.FindElement(By.XPath(".//span[contains(text(),'전체')]"));
|
||||||
|
string text = span.Text; // 예: "전체 5 "
|
||||||
|
var match = System.Text.RegularExpressions.Regex.Match(text, @"전체\s*(\d+)");
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
return int.Parse(match.Groups[1].Value);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 페이지 변경을 감지하는 메서드
|
||||||
|
public async Task WaitForPageChange(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 방법 4: 페이지 로딩 상태 확인
|
||||||
|
wait.Until(d =>
|
||||||
|
{
|
||||||
|
var readyState = ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState");
|
||||||
|
return readyState.Equals("complete");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 방법 5: 특정 텍스트가 페이지에 나타날 때까지 대기
|
||||||
|
wait.Until(d =>
|
||||||
|
{
|
||||||
|
var elm = d.FindElement(By.TagName("body"));
|
||||||
|
if (elm == null) return false;
|
||||||
|
var pageText = elm.Text;
|
||||||
|
return pageText.Contains("전체") || pageText.Contains("건") || pageText.Contains("검색결과");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 모든 감지 방법이 실패하면 최소한의 대기 시간 적용
|
||||||
|
await Task.Delay(2000);
|
||||||
|
throw new Exception($"페이지 변경 감지 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
641
unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs
Normal file
641
unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs
Normal file
@@ -0,0 +1,641 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using OpenQA.Selenium;
|
||||||
|
using OpenQA.Selenium.Chrome;
|
||||||
|
using OpenQA.Selenium.Support.UI;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using WebDriverManager;
|
||||||
|
using WebDriverManager.DriverConfigs.Impl;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading;
|
||||||
|
using UniMarc.마크;
|
||||||
|
|
||||||
|
namespace BokBonCheck
|
||||||
|
{
|
||||||
|
public class NamguLibrarySearcher_Munhwa : NamguLibrarySearcher
|
||||||
|
{
|
||||||
|
public NamguLibrarySearcher_Munhwa(int no) : base(no)
|
||||||
|
{
|
||||||
|
SiteName = "남구통합도서관(문화정보도서관)"; // 문화관 검색기
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == true)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
selector = "#libMA";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class NamguLibrarySearcher_Purungil : NamguLibrarySearcher
|
||||||
|
{
|
||||||
|
public NamguLibrarySearcher_Purungil(int no) : base(no)
|
||||||
|
{
|
||||||
|
SiteName = "남구통합도서관(푸른길도서관)";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == true)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
selector = "#libMB";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class NamguLibrarySearcher_Children : NamguLibrarySearcher
|
||||||
|
{
|
||||||
|
public NamguLibrarySearcher_Children(int no) : base(no)
|
||||||
|
{
|
||||||
|
SiteName = "남구통합도서관(청소년도서관)";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == true)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
selector = "#libMC";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
//searchBox.Click(); // 체크박스 선택
|
||||||
|
SafeClick(searchBox);
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class NamguLibrarySearcher_Hyocheon : NamguLibrarySearcher
|
||||||
|
{
|
||||||
|
public NamguLibrarySearcher_Hyocheon(int no) : base(no)
|
||||||
|
{
|
||||||
|
SiteName = "남구통합도서관(효천어울림도서관)";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected override bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == true)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
selector = "#libSW";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class NamguLibrarySearcher_Smart : NamguLibrarySearcher
|
||||||
|
{
|
||||||
|
public NamguLibrarySearcher_Smart(int no) : base(no)
|
||||||
|
{
|
||||||
|
SiteName = "남구통합도서관(스마트도서관)";
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == true)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
selector = "#libSQ";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class NamguLibrarySearcher : ILibrarySearcher
|
||||||
|
{
|
||||||
|
public string SiteName { get; protected set; } = "남구통합도서관(전체)";
|
||||||
|
public string SiteUrl => "https://lib.namgu.gwangju.kr/main/bookSearch";
|
||||||
|
|
||||||
|
public int No { get; set; }
|
||||||
|
|
||||||
|
private ChromeDriver _driver;
|
||||||
|
private ChromeDriverService _service;
|
||||||
|
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
|
||||||
|
[DllImport("user32.dll")]
|
||||||
|
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
|
||||||
|
private const int SW_MINIMIZE = 6;
|
||||||
|
|
||||||
|
public NamguLibrarySearcher(int no)
|
||||||
|
{
|
||||||
|
this.No = no;
|
||||||
|
}
|
||||||
|
|
||||||
|
//public async Task StartDriverAsync(bool showdriver=false)
|
||||||
|
//{
|
||||||
|
// if (_driver == null)
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// // ChromeDriverManager를 사용하여 안정적으로 드라이버 설정
|
||||||
|
// var driverPath = await ChromeDriverManager.SetupChromeDriverAsync();
|
||||||
|
|
||||||
|
// // ChromeDriver 서비스 생성
|
||||||
|
// _service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
|
||||||
|
// _service.HideCommandPromptWindow = true;
|
||||||
|
|
||||||
|
// // 안정적인 Chrome 옵션 가져오기 (브라우저 창 숨김)
|
||||||
|
// var options = ChromeDriverManager.CreateBaseChromeOptions(!showdriver);
|
||||||
|
|
||||||
|
// // 추가 보안 및 안정성 옵션
|
||||||
|
// options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
|
||||||
|
// options.AddArgument("--disable-blink-features=AutomationControlled");
|
||||||
|
// options.AddExcludedArgument("enable-automation");
|
||||||
|
// options.AddAdditionalOption("useAutomationExtension", false);
|
||||||
|
|
||||||
|
// // ChromeDriver 생성
|
||||||
|
// _driver = new ChromeDriver(_service, options);
|
||||||
|
|
||||||
|
// // 웹드라이버 감지 방지
|
||||||
|
// ((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
|
||||||
|
|
||||||
|
// Console.WriteLine("NamguLibrarySearcher ChromeDriver 초기화 완료");
|
||||||
|
// }
|
||||||
|
// catch (Exception ex)
|
||||||
|
// {
|
||||||
|
// Console.WriteLine($"ChromeDriver 초기화 실패: {ex.Message}");
|
||||||
|
// throw new InvalidOperationException($"ChromeDriver 초기화에 실패했습니다: {ex.Message}", ex);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
// 기존 StartDriver 메서드를 유지하여 호환성 보장
|
||||||
|
public void StartDriver(bool showBrowser)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 동기적으로 실행 (권장하지 않음)
|
||||||
|
StartDriverAsync(showBrowser).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"StartDriver 실패: {ex.Message}");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopDriver()
|
||||||
|
{
|
||||||
|
if (_driver != null)
|
||||||
|
{
|
||||||
|
_driver.Quit();
|
||||||
|
_driver.Dispose();
|
||||||
|
_driver = null;
|
||||||
|
}
|
||||||
|
if (_service != null)
|
||||||
|
{
|
||||||
|
_service.Dispose();
|
||||||
|
_service = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StartDriverAsync(bool showdriver = false)
|
||||||
|
{
|
||||||
|
if (_driver == null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// ChromeDriverManager를 사용하여 안정적으로 드라이버 설정
|
||||||
|
var driverPath = await ChromeDriverManager.SetupChromeDriverAsync();
|
||||||
|
|
||||||
|
// ChromeDriver 서비스 생성
|
||||||
|
_service = ChromeDriverService.CreateDefaultService(Path.GetDirectoryName(driverPath), Path.GetFileName(driverPath));
|
||||||
|
_service.HideCommandPromptWindow = true;
|
||||||
|
|
||||||
|
// 안정적인 Chrome 옵션 가져오기 (브라우저 창 숨김)
|
||||||
|
var options = ChromeDriverManager.CreateBaseChromeOptions(!showdriver);
|
||||||
|
|
||||||
|
// 추가 보안 및 안정성 옵션
|
||||||
|
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36");
|
||||||
|
options.AddArgument("--disable-blink-features=AutomationControlled");
|
||||||
|
options.AddExcludedArgument("enable-automation");
|
||||||
|
options.AddAdditionalOption("useAutomationExtension", false);
|
||||||
|
|
||||||
|
// ChromeDriver 생성
|
||||||
|
_driver = new ChromeDriver(_service, options);
|
||||||
|
|
||||||
|
// 웹드라이버 감지 방지
|
||||||
|
((IJavaScriptExecutor)_driver).ExecuteScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
|
||||||
|
|
||||||
|
Console.WriteLine("NamguLibrarySearcher ChromeDriver 초기화 완료");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"ChromeDriver 초기화 실패: {ex.Message}");
|
||||||
|
throw new InvalidOperationException($"ChromeDriver 초기화에 실패했습니다: {ex.Message}", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual protected bool SelectLibrary(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var selector = "#clickAll";
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
if (searchBox == null) return false;
|
||||||
|
if (searchBox.Selected == false)
|
||||||
|
{
|
||||||
|
SafeClick(searchBox);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine(ex.Message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SafeClick(IWebElement searchBox)
|
||||||
|
{
|
||||||
|
// 안정적인 클릭을 위한 여러 방법 시도
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 1. JavaScript로 클릭 시도
|
||||||
|
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
|
||||||
|
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", searchBox);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 2. 요소가 보이도록 스크롤 후 클릭
|
||||||
|
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
|
||||||
|
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", searchBox);
|
||||||
|
Thread.Sleep(500);
|
||||||
|
searchBox.Click();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 3. Actions 클래스 사용
|
||||||
|
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
|
||||||
|
var actions = new OpenQA.Selenium.Interactions.Actions(driver);
|
||||||
|
actions.MoveToElement(searchBox).Click().Perform();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// 4. 마지막 방법: JavaScript로 직접 체크 해제
|
||||||
|
var driver = ((IWrapsDriver)searchBox).WrappedDriver;
|
||||||
|
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].checked = false;", searchBox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<BookSearchResult> SearchAsync(string searchTerm)
|
||||||
|
{
|
||||||
|
var result = new BookSearchResult
|
||||||
|
{
|
||||||
|
SiteName = SiteName,
|
||||||
|
SearchTerm = searchTerm,
|
||||||
|
SearchTime = DateTime.Now
|
||||||
|
};
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 드라이버가 없으면 자동으로 시작
|
||||||
|
if (_driver == null)
|
||||||
|
{
|
||||||
|
await StartDriverAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
_driver.Navigate().GoToUrl(SiteUrl);
|
||||||
|
|
||||||
|
// 페이지 로딩 대기
|
||||||
|
var wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(15));
|
||||||
|
|
||||||
|
// 모든 감지 방법이 끝나면 크롬창 최소화
|
||||||
|
// whale 브라우저가 최소화되어 우선해제
|
||||||
|
//IntPtr chromeWindow = FindWindow("Chrome_WidgetWin_1", null);
|
||||||
|
//if (chromeWindow != IntPtr.Zero)
|
||||||
|
//{
|
||||||
|
// ShowWindow(chromeWindow, SW_MINIMIZE);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//대상도서관 선택
|
||||||
|
if (SelectLibrary(wait) == false)
|
||||||
|
{
|
||||||
|
result.ErrorMessage = "도서관선택실패";
|
||||||
|
result.BookCount = -1;
|
||||||
|
result.IsSuccess = false;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 검색창 찾기 (남구통합도서관 사이트의 특정 선택자 사용)
|
||||||
|
IWebElement searchBox = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 여러 가능한 선택자 시도
|
||||||
|
var selectors = new[]
|
||||||
|
{
|
||||||
|
"input[name='query']",
|
||||||
|
"input[id='query']",
|
||||||
|
"input[type='text']",
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var selector in selectors)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchBox == null)
|
||||||
|
{
|
||||||
|
throw new Exception("검색창을 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception($"검색창 찾기 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 검색어 입력
|
||||||
|
searchBox.Clear();
|
||||||
|
searchBox.SendKeys(searchTerm);
|
||||||
|
|
||||||
|
// 검색 버튼 클릭
|
||||||
|
IWebElement searchButton = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var buttonSelectors = new[]
|
||||||
|
{
|
||||||
|
"button[type='submit']",
|
||||||
|
"input[type='submit']",
|
||||||
|
".search-btn",
|
||||||
|
".btn-search",
|
||||||
|
"button:contains('검색')",
|
||||||
|
"input[value*='검색']",
|
||||||
|
"button[class*='search']",
|
||||||
|
"input[class*='search']"
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var selector in buttonSelectors)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
searchButton = _driver.FindElement(By.CssSelector(selector));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchButton == null)
|
||||||
|
{
|
||||||
|
// Enter 키로 검색 시도
|
||||||
|
searchBox.SendKeys(Keys.Enter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchButton.Click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// Enter 키로 검색 시도
|
||||||
|
searchBox.SendKeys(Keys.Enter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 페이지 변경을 감지하는 메서드
|
||||||
|
await WaitForPageChange(new WebDriverWait(_driver, TimeSpan.FromSeconds(15)));
|
||||||
|
|
||||||
|
// 검색 결과 수 추출
|
||||||
|
var resultCount = ExtractBookCount(_driver, searchTerm, out string ermsg);
|
||||||
|
if (resultCount == -1)
|
||||||
|
{
|
||||||
|
result.BookCount = 0;
|
||||||
|
result.IsSuccess = false;
|
||||||
|
result.ErrorMessage = ermsg;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.BookCount = resultCount;
|
||||||
|
result.IsSuccess = true;
|
||||||
|
result.ErrorMessage = ermsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.IsSuccess = false;
|
||||||
|
result.ErrorMessage = ex.Message;
|
||||||
|
result.BookCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int ExtractBookCount(IWebDriver driver, string searchTerm, out string errmessage)
|
||||||
|
{
|
||||||
|
errmessage = string.Empty;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// div.search-result 내부의 span에서 '전체 N' 텍스트 추출
|
||||||
|
var resultDiv = driver.FindElement(By.CssSelector("div.search-result"));
|
||||||
|
|
||||||
|
var bodytext = resultDiv.Text;
|
||||||
|
if (bodytext.Contains("검색결과가 없습니다"))
|
||||||
|
{
|
||||||
|
errmessage = "검색결과없음";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var searchkey = resultDiv.FindElement(By.XPath("//*[@id=\"sub\"]/section[3]/div/div/div/div/div[2]/div[1]/p/b"));
|
||||||
|
var searchtitle = searchkey.Text;
|
||||||
|
|
||||||
|
if (searchTerm.Contains(searchtitle) == false)
|
||||||
|
{
|
||||||
|
errmessage = $"검색어불일치({searchtitle}/{searchTerm})";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
var span = resultDiv.FindElement(By.XPath(".//span[contains(text(),'전체')]"));
|
||||||
|
string text = span.Text; // 예: "전체 5 "
|
||||||
|
var match = System.Text.RegularExpressions.Regex.Match(text, @"전체\s*(\d+)");
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
if (int.TryParse(match.Groups[1].Value, out int vqty) == false)
|
||||||
|
{
|
||||||
|
errmessage = $"수량값오류({match.Groups[1].Value})";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
searchTerm = string.Empty;
|
||||||
|
return vqty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
errmessage = "수량항목없음";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
errmessage = ex.Message;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 페이지 변경을 감지하는 메서드
|
||||||
|
public async Task WaitForPageChange(WebDriverWait wait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await Task.Delay(500);
|
||||||
|
|
||||||
|
// 방법 4: 페이지 로딩 상태 확인
|
||||||
|
wait.Until(d =>
|
||||||
|
{
|
||||||
|
var readyState = ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState");
|
||||||
|
return readyState.Equals("complete");
|
||||||
|
});
|
||||||
|
|
||||||
|
// 방법 5: 특정 텍스트가 페이지에 나타날 때까지 대기
|
||||||
|
wait.Until(d =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var byclassname = By.ClassName("search-result");
|
||||||
|
var elm = d.FindElement(byclassname);
|
||||||
|
if (elm == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var pageText = elm.Text;
|
||||||
|
if (pageText.Contains("검색결과가 없습니다")) return true;
|
||||||
|
return pageText.Contains("에 대하여") && pageText.Contains("검색되었습니다");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// 모든 감지 방법이 실패하면 최소한의 대기 시간 적용
|
||||||
|
await Task.Delay(2000);
|
||||||
|
throw new Exception($"페이지 변경 감지 실패: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2961,8 +2961,11 @@ namespace WindowsFormsApp1
|
|||||||
}
|
}
|
||||||
public string VersionInfo()
|
public string VersionInfo()
|
||||||
{
|
{
|
||||||
string version = "";
|
string version = "0";
|
||||||
StreamReader sr = new StreamReader(Application.StartupPath + "\\update.inf");
|
var fn = Application.StartupPath + "\\update.inf";
|
||||||
|
if(System.IO.File.Exists(fn))
|
||||||
|
{
|
||||||
|
StreamReader sr = new StreamReader(fn);
|
||||||
while (!sr.EndOfStream)
|
while (!sr.EndOfStream)
|
||||||
{
|
{
|
||||||
string line = sr.ReadLine();
|
string line = sr.ReadLine();
|
||||||
@@ -2972,6 +2975,8 @@ namespace WindowsFormsApp1
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,13 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<ManifestKeyFile>UniMarc_TemporaryKey.pfx</ManifestKeyFile>
|
<ManifestKeyFile>UniMarc_TemporaryKey.pfx</ManifestKeyFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationIcon>UniMarc.ico</ApplicationIcon>
|
||||||
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="AngleSharp, Version=1.3.0.0, Culture=neutral, PublicKeyToken=e83494dcdc6d31ea, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\AngleSharp.1.3.0\lib\net472\AngleSharp.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="arCommUtil">
|
<Reference Include="arCommUtil">
|
||||||
<HintPath>..\dll\arCommUtil.dll</HintPath>
|
<HintPath>..\dll\arCommUtil.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@@ -84,22 +90,77 @@
|
|||||||
<Reference Include="ArLog.Net4">
|
<Reference Include="ArLog.Net4">
|
||||||
<HintPath>..\dll\ArLog.Net4.dll</HintPath>
|
<HintPath>..\dll\ArLog.Net4.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\BouncyCastle.Cryptography.2.5.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="CarlosAg.ExcelXmlWriter">
|
<Reference Include="CarlosAg.ExcelXmlWriter">
|
||||||
<HintPath>..\dll\CarlosAg.ExcelXmlWriter.dll</HintPath>
|
<HintPath>..\dll\CarlosAg.ExcelXmlWriter.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.VisualBasic" />
|
<Reference Include="ICSharpCode.SharpZipLib, Version=1.4.2.13, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
|
||||||
<Reference Include="MySql.Data, Version=8.0.21.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
|
<HintPath>..\packages\SharpZipLib.1.4.2\lib\netstandard2.0\ICSharpCode.SharpZipLib.dll</HintPath>
|
||||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Renci.SshNet, Version=2020.0.1.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\SSH.NET.2020.0.1\lib\net40\Renci.SshNet.dll</HintPath>
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=8.0.0.2, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.2\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.3, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.8.0.3\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.VisualBasic" />
|
||||||
|
<Reference Include="Microsoft.Win32.Registry, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Microsoft.Win32.Registry.5.0.0\lib\net461\Microsoft.Win32.Registry.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="MySql.Data, Version=8.0.21.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
|
||||||
|
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Renci.SshNet, Version=2025.0.0.1, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SSH.NET.2025.0.0\lib\net462\Renci.SshNet.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.DirectoryServices" />
|
<Reference Include="System.DirectoryServices" />
|
||||||
|
<Reference Include="System.Formats.Asn1, Version=8.0.0.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Formats.Asn1.8.0.2\lib\net462\System.Formats.Asn1.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Runtime.Serialization" />
|
<Reference Include="System.Runtime.Serialization" />
|
||||||
|
<Reference Include="System.Security.AccessControl, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Principal.Windows, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.ServiceModel" />
|
<Reference Include="System.ServiceModel" />
|
||||||
|
<Reference Include="System.Text.Encoding.CodePages, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Encoding.CodePages.8.0.0\lib\net462\System.Text.Encoding.CodePages.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Encodings.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Encodings.Web.8.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Json, Version=8.0.0.5, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Text.Json.8.0.5\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="System.Web" />
|
<Reference Include="System.Web" />
|
||||||
<Reference Include="System.Web.Extensions" />
|
<Reference Include="System.Web.Extensions" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -111,6 +172,15 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<Reference Include="System.Windows.Forms" />
|
||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="WebDriver, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Selenium.WebDriver.4.34.0\lib\netstandard2.0\WebDriver.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="WebDriver.Support, Version=4.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Selenium.Support.4.34.0\lib\netstandard2.0\WebDriver.Support.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="WebDriverManager, Version=2.17.6.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\WebDriverManager.2.17.6\lib\net472\WebDriverManager.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="CExt.cs" />
|
<Compile Include="CExt.cs" />
|
||||||
@@ -124,7 +194,15 @@
|
|||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
<DependentUpon>Reference.svcmap</DependentUpon>
|
<DependentUpon>Reference.svcmap</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="CUtill.cs" />
|
<Compile Include="PUB.cs" />
|
||||||
|
<Compile Include="SearchModel\BookSearchService.cs" />
|
||||||
|
<Compile Include="SearchModel\ChromeDriverManager.cs" />
|
||||||
|
<Compile Include="SearchModel\DownloadProgressForm.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="SearchModel\ILibrarySearcher.cs" />
|
||||||
|
<Compile Include="SearchModel\KwangjuCityLibrarySearcher.cs" />
|
||||||
|
<Compile Include="SearchModel\NamguLibrarySearcher.cs" />
|
||||||
<Compile Include="마스터\From_User_manage_List.cs">
|
<Compile Include="마스터\From_User_manage_List.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -173,6 +251,12 @@
|
|||||||
<Compile Include="마크\CD_LP_Sub.Designer.cs">
|
<Compile Include="마크\CD_LP_Sub.Designer.cs">
|
||||||
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
|
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="마크\Check_copyWD.cs">
|
||||||
|
<SubType>Form</SubType>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="마크\Check_copyWD.Designer.cs">
|
||||||
|
<DependentUpon>Check_copyWD.cs</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="마크\Check_Copy_Login.cs">
|
<Compile Include="마크\Check_Copy_Login.cs">
|
||||||
<SubType>Form</SubType>
|
<SubType>Form</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -867,6 +951,9 @@
|
|||||||
<EmbeddedResource Include="마크\CD_LP_Sub.resx">
|
<EmbeddedResource Include="마크\CD_LP_Sub.resx">
|
||||||
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
|
<DependentUpon>CD_LP_Sub.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="마크\Check_copyWD.resx">
|
||||||
|
<DependentUpon>Check_copyWD.cs</DependentUpon>
|
||||||
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="마크\Check_Copy_Login.resx">
|
<EmbeddedResource Include="마크\Check_Copy_Login.resx">
|
||||||
<DependentUpon>Check_Copy_Login.cs</DependentUpon>
|
<DependentUpon>Check_Copy_Login.cs</DependentUpon>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
@@ -1848,6 +1935,7 @@
|
|||||||
<None Include="Resources\0_Empty.png" />
|
<None Include="Resources\0_Empty.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="UniMarc.ico" />
|
||||||
<None Include="Connected Services\BaroService_TI\configuration91.svcinfo" />
|
<None Include="Connected Services\BaroService_TI\configuration91.svcinfo" />
|
||||||
<None Include="Connected Services\BaroService_TI\configuration.svcinfo" />
|
<None Include="Connected Services\BaroService_TI\configuration.svcinfo" />
|
||||||
<None Include="Connected Services\BaroService_TI\Reference.svcmap">
|
<None Include="Connected Services\BaroService_TI\Reference.svcmap">
|
||||||
@@ -1868,4 +1956,11 @@
|
|||||||
<Content Include="Resources\3_2_2_편목.png" />
|
<Content Include="Resources\3_2_2_편목.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Import Project="..\packages\Selenium.WebDriver.4.34.0\build\Selenium.WebDriver.targets" Condition="Exists('..\packages\Selenium.WebDriver.4.34.0\build\Selenium.WebDriver.targets')" />
|
||||||
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||||
|
<PropertyGroup>
|
||||||
|
<ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Error Condition="!Exists('..\packages\Selenium.WebDriver.4.34.0\build\Selenium.WebDriver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Selenium.WebDriver.4.34.0\build\Selenium.WebDriver.targets'))" />
|
||||||
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
<ErrorReportUrlHistory />
|
<ErrorReportUrlHistory />
|
||||||
<FallbackCulture>ko-KR</FallbackCulture>
|
<FallbackCulture>ko-KR</FallbackCulture>
|
||||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||||
|
<ProjectView>ProjectFiles</ProjectView>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<EnableSecurityDebugging>false</EnableSecurityDebugging>
|
<EnableSecurityDebugging>false</EnableSecurityDebugging>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 66 KiB |
@@ -1,2 +0,0 @@
|
|||||||
ID=sh
|
|
||||||
PW=123
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
|||||||
idx,등록일,마감일,작업목록명,연동목록명,분류,전체,편목,미편목,상태,등급,비고,담당자,V,
|
|
||||||
DataGridViewTextBoxCell { ColumnIndex=0, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=1, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=2, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=3, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=4, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=5, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=6, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=7, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=8, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=9, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=10, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=11, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=12, RowIndex=0 },DataGridViewTextBoxCell { ColumnIndex=13, RowIndex=0 },
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,68 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
|
||||||
<section name="UniMarc.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
|
||||||
</sectionGroup>
|
|
||||||
</configSections>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/></startup>
|
|
||||||
<system.serviceModel>
|
|
||||||
<bindings>
|
|
||||||
<basicHttpBinding>
|
|
||||||
<binding name="BaroService_FAXSoap" />
|
|
||||||
<binding name="BaroService_TISoap">
|
|
||||||
<security mode="Transport" />
|
|
||||||
</binding>
|
|
||||||
<binding name="BaroService_TISoap1" />
|
|
||||||
</basicHttpBinding>
|
|
||||||
</bindings>
|
|
||||||
<client>
|
|
||||||
<endpoint address="http://testws.baroservice.com/FAX.asmx" binding="basicHttpBinding"
|
|
||||||
bindingConfiguration="BaroService_FAXSoap" contract="BaroService_API.BaroService_FAXSoap"
|
|
||||||
name="BaroService_FAXSoap" />
|
|
||||||
<endpoint address="https://testws.baroservice.com/TI.asmx" binding="basicHttpBinding"
|
|
||||||
bindingConfiguration="BaroService_TISoap" contract="BaroService_TI.BaroService_TISoap"
|
|
||||||
name="BaroService_TISoap" />
|
|
||||||
</client>
|
|
||||||
</system.serviceModel>
|
|
||||||
<runtime>
|
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
|
||||||
<dependentAssembly>
|
|
||||||
<assemblyIdentity name="Renci.SshNet" publicKeyToken="1cee9f8bde3db106" culture="neutral"/>
|
|
||||||
<bindingRedirect oldVersion="0.0.0.0-2020.0.1.0" newVersion="2020.0.1.0"/>
|
|
||||||
</dependentAssembly>
|
|
||||||
</assemblyBinding>
|
|
||||||
</runtime>
|
|
||||||
<userSettings>
|
|
||||||
<UniMarc.Properties.Settings>
|
|
||||||
<setting name="compidx" serializeAs="String">
|
|
||||||
<value />
|
|
||||||
</setting>
|
|
||||||
<setting name="User" serializeAs="String">
|
|
||||||
<value />
|
|
||||||
</setting>
|
|
||||||
<setting name="IP" serializeAs="String">
|
|
||||||
<value>1.11010111.11111010.10000010</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="Port" serializeAs="String">
|
|
||||||
<value>1100101111</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="Uid" serializeAs="String">
|
|
||||||
<value>103.108.111.114.105.97.98.111.111.107</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="pwd" serializeAs="String">
|
|
||||||
<value>97.100.109.105.110.64.33.64.35.36</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="dbPort" serializeAs="String">
|
|
||||||
<value>110011101010</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="dbUid" serializeAs="String">
|
|
||||||
<value>114.111.111.116</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="dbPwd" serializeAs="String">
|
|
||||||
<value>65.100.109.105.110.50.49.50.51.52</value>
|
|
||||||
</setting>
|
|
||||||
</UniMarc.Properties.Settings>
|
|
||||||
</userSettings>
|
|
||||||
</configuration>
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,4 +0,0 @@
|
|||||||
9788969524102 1 간호사를 간호하는 간호사 경향BP 오성훈 13500 60 8100 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 10
|
|
||||||
9791195010073 1 감정조절자(희망) : 나를 힘겹게 하는 나와 작별하기 프로젝트 헥소미아 김인자 16000 60 9600 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 11
|
|
||||||
9788932320625 1 개는 우리를 어떻게 사랑하는가 : 개의 특별한 애정에 대한 과학적 탐구 현암사 클라이브 D. L. 윈 ; 전행선 17000 60 10200 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 12
|
|
||||||
9791158491307 1 걷다 느끼다 쓰다 : 전문성과 대중성을 겸비한 글쓰기 수업 모아북스 이해사 15000 60 9000 [(주)글로리아북]납품 2021-07-14 오후 1:44 머리 13
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
// <autogenerated />
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
a980cc54cfee34721f8734aaae513dd71cd3d934
|
|
||||||
@@ -1,154 +0,0 @@
|
|||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\MySql.Data.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Newtonsoft.Json.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Renci.SshNet.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Google.Protobuf.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Zstandard.Net.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Compression.LZ4.Streams.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\BouncyCastle.Crypto.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Ubiety.Dns.Core.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Buffers.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Compression.LZ4.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\K4os.Hash.xxHash.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Runtime.CompilerServices.Unsafe.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\MySql.Data.xml
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Newtonsoft.Json.xml
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\Renci.SshNet.xml
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.ResolveComReference.cache
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.납품관리.Bring_Back.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.납품관리.Order_Send_Chk.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Check_ISBN_Sub.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.findNchange.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.Helper008.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Job_Order.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Mac_Chack_Up.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Mac_List_Merge.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Make_Document.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ExcelTest.Marc.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.마크.Search_Infor_Sub.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Bill_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Aggregation.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Book.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_Input.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Remit_reg2.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_Book.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Lookup.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Deposit.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_Detail.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Input.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Purchase_not_pay.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Remit_reg.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.회계.Sales_In_Pay.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Account.Sales_Not_Pay.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Board.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Calendar.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Quick_menu.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_End.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Member_Manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Sale.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Sale_Settlement.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Send_Notice.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Convenience.Talk.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Book_Lookup.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Edit.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Morge.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_registration.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Commodity_Search.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Input_Lookup_Stock.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_aggregation.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_Chk_Work.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.List_Lookup.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Order_input.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Order_input_Search.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Delivery.Purchase.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.DLS.Input_DLS.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.DLS.School_Lookup.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Book_infor_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.ledger_of_use.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.memo.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Order_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.pw_change.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Transaction_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Home_User_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.User_Infor.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home._Sub_Search_Form.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.All_Book_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Check_copy.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Check_ISBN.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Collect_Mac.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.DLS_Copy.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Output.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Equip_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Stat.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_Input.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Mac_List.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Nonverbal.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Search_Infor.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Set_Macro.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Setup_Shortcut.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Symbol_Add.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Batch_processing.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac_Setting.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Notice_Send.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Sales_Details.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.User_account_inquiry.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.User_manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.login.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Main.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Work_log.Work_Log.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Home.Home_User_manage.ko.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.GenerateResource.cache
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.CoreCompileInputs.cache
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.CopyComplete
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.Properties.Resources.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.exe.config
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.exe
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\UniMarc.pdb
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\ko\UniMarc.resources.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\ko\UniMarc.resources.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.exe
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.pdb
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_memo.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Zoom_Picture.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_ISBN_Yes24.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.회계.Part_time.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_manage_Add.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_manage_Edit.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.All_Book_Detail.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Preview.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_ISBN_Split.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Mac_Stat_Stat.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\WindowsFormsApp1.Mac.Marc_Plan.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_mkList.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList_Edit.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_MarcEdit.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Sub_Search.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Sub_List.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\Interop.SHDocVw.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.DLS_Manage.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.Marc_FillBlank.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_Sub_SelectList_Morge.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.MarcCopySelect.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Mac_List_Add.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_PrintLabel.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.ShowDeleteMarc.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Check_Copy_Login.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.AddMarc.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_Sub.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_SelectList.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Help_007.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Help_008.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_List.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.AddMarc_FillBlank.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_ClassSymbol.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.Marc_Plan_GearExcel.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.마크.CD_LP_AddList.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\ArLog.Net4.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.From_User_manage_List.resources
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Memory.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\System.Numerics.Vectors.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\arControl.Net4.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\CarlosAg.ExcelXmlWriter.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\bin\Debug\arCommUtil.dll
|
|
||||||
C:\Users\Administrator\Desktop\unimarc\unimarc\UniMarc\obj\Debug\UniMarc.csproj.AssemblyReference.cache
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user