From 5c2736ba36fdab33460d23c6c958d24576361b0a Mon Sep 17 00:00:00 2001 From: Janie <109517022+Janie06@users.noreply.github.com> Date: Thu, 5 Jan 2023 17:11:47 +0800 Subject: [PATCH] =?UTF-8?q?[WHAT]=20SignupWithEmail=E3=80=81Verify=20Email?= =?UTF-8?q?=20API=E5=AE=8C=E6=88=90=20[WHY]=20feature=20[HOW]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EasyBL.WEBAPP/ShowEasy/SignupService.cs | 461 ++++++++++++++++++ .../WebApp/Controllers/SignupController.cs | 47 ++ 2 files changed, 508 insertions(+) create mode 100644 EuroTran/EasyBL.WEBAPP/ShowEasy/SignupService.cs create mode 100644 EuroTran/WebApp/Controllers/SignupController.cs diff --git a/EuroTran/EasyBL.WEBAPP/ShowEasy/SignupService.cs b/EuroTran/EasyBL.WEBAPP/ShowEasy/SignupService.cs new file mode 100644 index 0000000..552f84d --- /dev/null +++ b/EuroTran/EasyBL.WEBAPP/ShowEasy/SignupService.cs @@ -0,0 +1,461 @@ + +using EasyBL.WebApi; +using EasyBL.WebApi.Common; +using EasyBL.WebApi.Message; +using EasyNet; +using Entity.ShowEasyDtos; +using Entity.Sugar; +using Entity.ViewModels; +using Newtonsoft.Json; +using SqlSugar; +using SqlSugar.Base; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Web; +using System.Net.Mail; + +namespace EasyBL.WEBAPP.SYS +{ + public class SignupService : ServiceBase + { + public static string SERVER_IP = "localhost"; + public static string SERVER_PORT = "3466"; + + //使用者以信箱註冊(API Function) + public HttpResponseMessage SignupWithEmail(SETB_CMS_Member newUser) + { + string sMsg = null; + SuccessResponseMessage srm = SugarBase.ExecTran(db => + { + do + { + string sAccount = newUser.Account; + string sPassword = newUser.Password; + string sEmail = newUser.Email; + string sMemberID = Guid.NewGuid().ToString(); //會員編號為GUID + string sOrgID = "TG"; //公司編號預設為TG + string sStatus = "0"; //會員狀態為未驗證(F) + + string sError = ""; //寄信若有錯誤回傳之訊息 + + string sEncryptPwd = SecurityUtil.Encrypt(sPassword); //密碼加密 + newUser.MemberID = sMemberID; + newUser.OrgID = sOrgID; + newUser.Status = sStatus; + newUser.Password = sEncryptPwd; + + //開始寄信 + var oEmail = new Emails(); //寄件人 + var toEmail = new List(); //收件人 + var oEmailTo = new EmailTo //收件人資訊 + { + ToUserID = newUser.MemberID, + ToUserName = newUser.LastName, + ToEmail = newUser.Email, + Type = "to" + }; + toEmail.Add(oEmailTo); + oEmail.FromUserName = "【ShowEasy 會員認證】"; //取fonfig + oEmail.Title = "感謝您註冊ShowEasy"; //取fonfig + oEmail.EmailBody = createEmail(newUser.OrgID, newUser.MemberID, newUser.FirstName); + oEmail.IsCCSelf = false; + oEmail.Attachments = null; + oEmail.EmailTo = toEmail; + var bSend = new MailService(sOrgID, true).MailFactory(oEmail, out sError); + + var iRel = db.Insertable(newUser).ExecuteCommand(); + + srm = new SuccessResponseMessage(null, null); + srm.DATA.Add(BLWording.REL, iRel); + } while (false); + + return srm; + + }); + + return HttpResponseExtension.ToJson(JsonConvert.SerializeObject(srm)); + } + + //重新寄送認證信 + public HttpResponseMessage ReSendVerifyMail(string OrgID, string MemberID) + { + string sMsg = null; + SuccessResponseMessage srm = SugarBase.ExecTran(db => + { + do + { + var Mailto = db.Queryable().Single(x => x.OrgID == OrgID && x.MemberID == MemberID); + string sEmail = Mailto.Email; + string sOrgID = Mailto.OrgID; + string sError = ""; + + var oEmail = new Emails(); //寄件人 + var toEmail = new List(); //收件人 + var oEmailTo = new EmailTo //收件人資訊 + { + ToUserID = Mailto.MemberID, + ToUserName = Mailto.LastName, + ToEmail = Mailto.Email, + Type = "to" + }; + toEmail.Add(oEmailTo); + oEmail.FromUserName = "【ShowEasy 會員認證】"; //取fonfig + oEmail.Title = "感謝您註冊ShowEasy"; //取fonfig + oEmail.EmailBody = createEmail(OrgID, MemberID, Mailto.FirstName); + oEmail.IsCCSelf = false; + oEmail.Attachments = null; + oEmail.EmailTo = toEmail; + var bSend = new MailService(sOrgID, true).MailFactory(oEmail, out sError); + //if (sError != null) + //{ + // break; + //} + + srm = new SuccessResponseMessage(null, null); + srm.DATA.Add(BLWording.REL, sError); + } while (false); + + return srm; + + }); + + return HttpResponseExtension.ToJson(JsonConvert.SerializeObject(srm)); + } + + + //會員認證 + public HttpResponseMessage VerifyAccount(string OrgID, string MemberID) + { + string sMsg = null; + + SuccessResponseMessage srm = SugarBase.ExecTran(db => + { + do + { + var oUser = db.Queryable().Single(x => x.OrgID == OrgID && x.MemberID == MemberID); + oUser.Status = "1"; //註冊成功 + var iRel = db.Updateable(oUser).ExecuteCommand(); + //注冊成功后默認登錄 + var ticket = new OTB_SYS_TicketAuth + { + OrgID = oUser.OrgID, + UserID = oUser.Account, + UserName = oUser.FirstName, + Token = SignExtension.CreateToken(), + // LoginIp = i_crm.ClientIP, + LoginTime = DateTime.Now + }; + var iExpireTime = 240; + var sExpireTime = Common.GetSystemSetting(db, oUser.OrgID, @"ExpireTime"); + if (!string.IsNullOrEmpty(sExpireTime)) + { + iExpireTime = int.Parse(sExpireTime); + } + else + { + iExpireTime = int.Parse(Common.GetAppSettings(@"ExpireTime")); + } + ticket.ExpireTime = DateTime.Now.AddMinutes(iExpireTime); //30分钟过期 + ticket.IsVerify = @"Y"; + var oTicket = db.Queryable().Single(x => x.OrgID == OrgID && x.UserID == oUser.Account); + if (oTicket != null) + { + db.Updateable(ticket).IgnoreColumns(x => x.OutlookId).Where(x => x.NO == oTicket.NO).ExecuteCommand(); + } + else + { + ticket.CreateTime = DateTime.Now; + db.Insertable(ticket).ExecuteCommand(); + } + //記錄log日誌 + db.Insertable(new OTB_SYS_LoginLog + { + OrgId = ticket.OrgID, + UserId = ticket.UserID, + UserName = ticket.UserName, + LoginIp = ticket.LoginIp, + LoginTime = ticket.LoginTime + }).ExecuteCommand(); + HttpRuntimeCache.Set(ticket.OrgID + ticket.UserID, ticket, iExpireTime * 60, true); + HttpContext.Current.Session.Add(@"orgid", ticket.OrgID); + HttpContext.Current.Session.Add(@"userid", ticket.UserID); + HttpCookie cookie = new HttpCookie("EURO_COOKIE"); //初始化並設置Cookie的名稱 + DateTime dt = DateTime.Now; + TimeSpan ts = new TimeSpan(0, 0, 1, 0, 0); //過期時間為1分鐘 + cookie.Expires = dt.Add(ts); //設置過期時間 + cookie.Values.Add("orgid", ticket.OrgID); + cookie.Values.Add("userid", ticket.UserID); + HttpContext.Current.Response.AppendCookie(cookie); + + var strtoken = string.Format(@"orgid:{0},userid:{1},token:{2}", ticket.OrgID, ticket.UserID, ticket.Token); + srm = new SuccessResponseMessage(null, null); + srm.DATA.Add("authtoken", SecurityUtil.Encrypt(strtoken)); + + } while (false); + + return srm; + }); + + return HttpResponseExtension.ToJson(JsonConvert.SerializeObject(srm)); + } + + //Mail Template + private string createEmail(string OrgID, string MemberID, string FirstName) + { + + StringBuilder sb = new StringBuilder(); + + sb.Append(""); + sb.Append(" "); + + //Head + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(" "); + + //CSS Reset Style + sb.Append(""); + + //CSS Style + //Hover styles for buttons and tags + sb.Append(""); + sb.Append(""); + + //BODY + //The email background color is defined in three places, just below. If you change one, remember to change the others. + //1. body tag: for most email clients + //2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr + //3. mso conditional: For Windows 10 Mail + sb.Append(" "); + sb.Append("
"); + sb.Append("
"); + sb.Append(" "); + //ShowEasy Logo + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Email Body + sb.Append(""); + sb.Append(""); + sb.Append(""); + + //Footer + //Text:Follow us + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append(""); + sb.Append(" "); + sb.Append(""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append(" "); + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Text:VerifyYourAccount + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Text:Hi,xxx + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Text:Welcome to.... + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Button:Verify my account + sb.Append(""); + sb.Append(""); + sb.Append(""); + + //Email Buttom + //Text:If the button isn't working.... + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Link + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append(" "); + sb.Append("
"); + sb.Append("

"); + sb.Append("VERIFY YOUR ACCOUNT"); + sb.Append("

"); + sb.Append("
"); + sb.Append("

"); + sb.Append("Hi " + FirstName + ","); + sb.Append("

"); + sb.Append("
"); + sb.Append("

"); + sb.Append("Welcome to ShowEasy!
"); + sb.Append("Thanks for joining us, please click Verify my account to
"); + sb.Append("complete and activate your account. The link will be expired
"); + sb.Append("in 30 minutes."); + sb.Append("

"); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append(""); + sb.Append("Verify my account"); + sb.Append(""); + sb.Append("
"); + sb.Append("
"); + sb.Append("

"); + sb.Append("If the button isn't working, you can click the link below:"); + sb.Append("

"); + sb.Append("
"); + sb.Append(""); + sb.Append("https://www.showeasy.com/aboutUs"); + sb.Append(""); + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + //FB、IG、Medium Icon + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Text:2022 Showeasy. All rights reserved. + sb.Append(""); + sb.Append(""); + sb.Append(""); + //Text:www.showeasy.com + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("

"); + sb.Append("FOLLOW US"); + sb.Append("

"); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append(""); + sb.Append("
"); + sb.Append("
"); + sb.Append("

"); + sb.Append("© 2022 Showeasy. All rights reserved."); + sb.Append("

"); + sb.Append("
"); + sb.Append("

"); + sb.Append("www.showeasy.com"); + sb.Append("

"); + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + sb.Append("
"); + sb.Append(""); + sb.Append(""); + + return sb.ToString(); + + } + + + } + +} \ No newline at end of file diff --git a/EuroTran/WebApp/Controllers/SignupController.cs b/EuroTran/WebApp/Controllers/SignupController.cs new file mode 100644 index 0000000..837ed6b --- /dev/null +++ b/EuroTran/WebApp/Controllers/SignupController.cs @@ -0,0 +1,47 @@ +using EasyBL.WebApi.Filters; +using EasyBL.WEBAPP.ShowEasy; +using EasyBL.WEBAPP.SYS; +using Entity.ShowEasyDtos; +using Entity.Sugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Web.Http; + +namespace WebApp.Controllers +{ + public class SignupController : ApiController + { + + //使用者以信箱註冊 + [HttpPost] + public HttpResponseMessage SignupWithEmail([FromBody] SETB_CMS_Member dto) + { + + return new SignupService().SignupWithEmail(dto); + + } + + //重新寄送認證信 + [HttpGet] + public HttpResponseMessage ReSendVerifyMail(string OrgID, string MemberID) + { + + return new SignupService().ReSendVerifyMail(OrgID, MemberID); + + } + + //會員認證 + [HttpGet] + public HttpResponseMessage VerifyAccount(string OrgID, string MemberID) + { + + return new SignupService().VerifyAccount(OrgID, MemberID); + + } + + + } +}