feat: MachineBridge 추가 및 fetch API를 HostObject 호출로 전환
- WebView2 HostObject 기반 MachineBridge 브릿지 클래스 추가 - MachineBridge.cs (메인), Login, Dashboard, Todo, Common, Jobreport, Kuntae, Project 모듈 - WebSocketServer.cs 추가 (실시간 통신용) - fDashboardNew 다이얼로그 추가 - Jobreport/index.html, Project/index.html의 fetch API를 machine HostObject 호출로 전환 - DashBoardController.cs의 gcode null 처리 추가 - 사용하지 않는 파일 삭제 (navigation.html, common-nav.js, navigation.js, _add_to_project.py, _project_updater.js) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
293
Project/Web/MachineBridge/MachineBridge.Login.cs
Normal file
293
Project/Web/MachineBridge/MachineBridge.Login.cs
Normal file
@@ -0,0 +1,293 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Windows.Forms;
|
||||
using Newtonsoft.Json;
|
||||
using FCOMMON;
|
||||
|
||||
namespace Project.Web
|
||||
{
|
||||
public partial class MachineBridge
|
||||
{
|
||||
#region Login API
|
||||
|
||||
/// <summary>
|
||||
/// 로그인 처리 (fLogin_WB.cs의 button1_Click 로직 참고)
|
||||
/// </summary>
|
||||
public string Login(string gcode, string id, string password, bool rememberMe)
|
||||
{
|
||||
var result = new LoginResult();
|
||||
DateTime dt = DateTime.Now;
|
||||
|
||||
try
|
||||
{
|
||||
if (string.IsNullOrEmpty(id))
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "사용자 ID를 입력하세요.";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(password))
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "비밀번호를 입력하세요.";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(gcode))
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "소속 부서를 선택하세요.";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
// 부서명 조회
|
||||
var deptName = DBM.ExecuteScalar($"SELECT dept FROM UserGroup WHERE gcode = '{gcode}'") ?? "";
|
||||
|
||||
var encpass = Pub.MakePasswordEnc(password.Trim());
|
||||
|
||||
// 개발자 계정 처리
|
||||
if (id.ToUpper().Equals("DEV"))
|
||||
{
|
||||
if (!password.Equals("123"))
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "암호가 일치하지 않습니다.";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
SetDevLoginInfo(gcode, deptName);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 일반 사용자 로그인 처리
|
||||
var taGrpUser = new dsMSSQLTableAdapters.EETGW_GroupUserTableAdapter();
|
||||
var drGrpUser = taGrpUser.GetbyID(gcode, id).FirstOrDefault();
|
||||
|
||||
if (drGrpUser == null)
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
if (drGrpUser.level == 0)
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "해당 계정이 활성화되지 않았습니다.\n계정 담당자 문의하세요";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
// 사용자 테이블에서 암호 확인
|
||||
var taUser = new dsMSSQLTableAdapters.UsersTableAdapter();
|
||||
var drUser = taUser.GetID(id).FirstOrDefault();
|
||||
|
||||
if (drUser == null)
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = $"입력한 사용자 계정이 존재하지 않습니다.\n\n담당부서명:{deptName}\n부서코드:{gcode}\n\n접속 부서를 확인하시고 관리자 문의 하세요";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
if (!drUser.password.Equals(encpass))
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "암호가 일치하지 않습니다.\n암호를 분실했을 경우에는 계정담당자에 초기화를 요청 하세요";
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
// 버전 체크
|
||||
var MaxVersion = DBM.GetMaxVersion();
|
||||
if (!MaxVersion.isEmpty())
|
||||
{
|
||||
var curversion = Application.ProductVersion;
|
||||
var verchk = curversion.CompareTo(MaxVersion);
|
||||
if (verchk < 0)
|
||||
{
|
||||
result.VersionWarning = "현재 구 버젼을 사용하고 있습니다.\n업데이트를 진행 하고 사용하시기 바랍니다";
|
||||
}
|
||||
}
|
||||
|
||||
// 로그인 정보 설정
|
||||
var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");
|
||||
|
||||
info.Login.no = drUser.id;
|
||||
info.Login.nameK = drUser.name;
|
||||
info.Login.dept = deptName;
|
||||
info.Login.level = drGrpUser.level;
|
||||
info.Login.email = drUser.email;
|
||||
info.Login.nameE = drUser.nameE;
|
||||
info.Login.hp = drUser.hp;
|
||||
info.Login.tel = drUser.tel;
|
||||
info.Login.title = drUser.dept + "(" + drUser.grade + ")";
|
||||
info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
|
||||
info.Login.gcode = gcode;
|
||||
info.Login.process = drGrpUser.Process;
|
||||
info.Login.permission = 0;
|
||||
info.Login.gpermission = int.Parse(gperm);
|
||||
info.ShowBuyerror = Pub.setting.Showbuyerror;
|
||||
}
|
||||
|
||||
// 설정 저장 (rememberMe 처리)
|
||||
if (rememberMe)
|
||||
{
|
||||
var idlist = new List<string> { id.Trim() };
|
||||
var vuserlist = "";
|
||||
foreach (var item in idlist)
|
||||
vuserlist += ";" + item;
|
||||
|
||||
Pub.setting.lastid = vuserlist;
|
||||
Pub.setting.lastdpt = deptName;
|
||||
Pub.setting.lastgcode = gcode;
|
||||
Pub.setting.Save();
|
||||
}
|
||||
|
||||
// 로그인 정보 기록
|
||||
AddLoginInfo();
|
||||
|
||||
// 자동 업무일지 생성
|
||||
Pub.MakeAutoJobReportbyLogin();
|
||||
Pub.MakeAutoJobReportByAuto();
|
||||
|
||||
info.Login.loginusetime = (DateTime.Now - dt).TotalMilliseconds;
|
||||
|
||||
// fMain의 로그인 완료 후처리 호출
|
||||
CallMainFormLoginCompleted();
|
||||
|
||||
result.Success = true;
|
||||
result.Message = "로그인 성공";
|
||||
result.RedirectUrl = "/DashBoard/index.html";
|
||||
result.UserName = info.Login.nameK;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result.Success = false;
|
||||
result.Message = "데이터베이스 조회 실패. 다음 오류 메세지를 참고하세요.\n\n" + ex.Message;
|
||||
}
|
||||
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// fMain의 OnLoginCompleted() 호출
|
||||
/// </summary>
|
||||
private void CallMainFormLoginCompleted()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Application.OpenForms에서 fMain 인스턴스 찾기
|
||||
foreach (Form form in Application.OpenForms)
|
||||
{
|
||||
if (form is fMain mainForm)
|
||||
{
|
||||
// UI 스레드에서 실행
|
||||
if (mainForm.InvokeRequired)
|
||||
{
|
||||
mainForm.Invoke(new Action(() => mainForm.OnLoginCompleted()));
|
||||
}
|
||||
else
|
||||
{
|
||||
mainForm.OnLoginCompleted();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"OnLoginCompleted 호출 오류: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 개발자 로그인 정보 설정
|
||||
/// </summary>
|
||||
private void SetDevLoginInfo(string gcode, string deptName)
|
||||
{
|
||||
var gperm = DBM.ExecuteScalar($"SELECT ISNULL(permission,0) FROM UserGroup WHERE gcode = '{gcode}'");
|
||||
|
||||
info.Login.no = "dev";
|
||||
info.Login.nameK = "개발자";
|
||||
info.Login.dept = deptName;
|
||||
info.Login.level = 10;
|
||||
info.Login.email = "";
|
||||
info.Login.nameE = "DEVELOPER";
|
||||
info.Login.hp = "";
|
||||
info.Login.tel = "";
|
||||
info.Login.title = "업무일지 개발자";
|
||||
info.NotShowJobReportview = Pub.setting.NotShowJobreportPRewView;
|
||||
info.Login.gcode = gcode;
|
||||
info.Login.process = "개발자";
|
||||
info.Login.permission = 0;
|
||||
info.Login.gpermission = int.Parse(gperm);
|
||||
info.ShowBuyerror = Pub.setting.Showbuyerror;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 로그인 정보 기록
|
||||
/// </summary>
|
||||
private void AddLoginInfo()
|
||||
{
|
||||
string ip = string.Empty;
|
||||
string hostname = Dns.GetHostName();
|
||||
string fullname = Dns.GetHostEntry("").HostName;
|
||||
|
||||
var host = Dns.GetHostEntry(hostname);
|
||||
foreach (IPAddress r in host.AddressList)
|
||||
{
|
||||
string str = r.ToString();
|
||||
if (!string.IsNullOrEmpty(str) && str.StartsWith("10."))
|
||||
{
|
||||
ip = str;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(ip) || string.IsNullOrEmpty(hostname)) return;
|
||||
|
||||
try
|
||||
{
|
||||
var ta = new dsMSSQLTableAdapters.EETGW_LoginInfoTableAdapter();
|
||||
ta.Insert(info.Login.no, DateTime.Now, ip, fullname, info.Login.no, DateTime.Now);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 그룹 목록 조회
|
||||
/// </summary>
|
||||
public string GetUserGroups()
|
||||
{
|
||||
var dt = DBM.GetUserGroups();
|
||||
return JsonConvert.SerializeObject(dt, new JsonSerializerSettings
|
||||
{
|
||||
NullValueHandling = NullValueHandling.Ignore
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이전 로그인 정보 조회
|
||||
/// </summary>
|
||||
public string GetPreviousLoginInfo()
|
||||
{
|
||||
var result = new
|
||||
{
|
||||
Success = true,
|
||||
Data = new
|
||||
{
|
||||
LastGcode = Pub.setting.lastgcode ?? "",
|
||||
LastDept = Pub.setting.lastdpt ?? "",
|
||||
LastId = Pub.setting.lastid?.TrimStart(';').Split(';').FirstOrDefault() ?? ""
|
||||
}
|
||||
};
|
||||
return JsonConvert.SerializeObject(result);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user