chore: 首次簽入 Thinkyu ASP.NET 專案

- 加入 Visual Studio / ASP.NET .gitignore
- 排除建置輸出、IDE 設定、NuGet packages、大型 MSI 安裝檔
This commit is contained in:
2026-09-10 09:42:37 +08:00
commit 577060bc78
2496 changed files with 501389 additions and 0 deletions
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 如需使用 web.config 轉換的詳細資訊,請造訪 http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
在下面的範例中,"SetAttributes" 轉換只會在 "Match" 定位程式找到
值為 "MyDB" 的屬性 "name" 時,才將 "connectionString" 的值變
更為使用 "ReleaseSQLServer"。
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
在下面的範例中,"Replace" 轉換將會取代 web.config 檔案
的整個 <customErrors> 區段。
請注意,因為在 <system.web> 節點之下
只有一個 customErrors 區段,所以不需要使用 "xdt:Locator" 屬性。
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 如需使用 web.config 轉換的詳細資訊,請造訪 http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>
</configuration>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!--
如需如何設定 ASP.NET 應用程式的詳細資訊,請造訪
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<authorization>
<deny users="*"/>
</authorization>
</system.web>
</configuration>
+428
View File
@@ -0,0 +1,428 @@
using Education.Report;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Web;
using System.Web.Services.Description;
using WebLib;
namespace Education
{
public class
{
public HttpContext Context;
private string CheckMark(bool value)
{
return value ? "&#9745" : "&#9744";
}
public void (string , string Email, DateTime ,
DateTime , string )
{
if (string.IsNullOrEmpty(Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/報名郵件.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統報名成功通知】{0} {1}",
.Get訓練日期Str(, , "yyyy-MM-dd"), );
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{訓練日期}", .Get訓練日期Str(, )) // .ToString("yyyy年MM月dd日(dddd)") + (訓練日期迄.Ticks > 0 ? "至" + 訓練日期迄.ToString("yyyy年MM月dd日(dddd)") : ""))
.Replace("{訓練名稱}", );
mm.To.Add(new MailAddress(Email, ));
MailService.Send(mm, String.Format("報名成功郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
, .Get訓練日期Str(, , "yyyy-MM-dd"), ));
}
public void (string , string Email, DateTime ,
DateTime , string )
{
if (string.IsNullOrEmpty(Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/取消報名郵件.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統取消報名通知】{0} {1}",
.Get訓練日期Str(, , "yyyy-MM-dd"), );
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{取消日期}", DateTime.UtcNow.AddHours(8).Date.ToString("yyyy年MM月dd日"))
.Replace("{訓練日期}", .Get訓練日期Str(, ))
.Replace("{訓練名稱}", );
mm.To.Add(new MailAddress(Email, ));
MailService.Send(mm, String.Format("取消報名郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
, .Get訓練日期Str(, , "yyyy-MM-dd"), ));
}
public void (string , string Email,
string , string , string Email, string ,
DateTime , DateTime , string , string , int ,
List List, string , Stream )
{
if (string.IsNullOrEmpty(Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/學員行前通知.html"));
string = "";
// 拿課程類別來存放講師姓名
foreach ( item in List)
{
+= String.Format("<tr><td class=\"center\">{0}</td><td>{1}</td><td class=\"center\">{2}</td><td class=\"center\">{3}</td></tr>",
item., item., item., item.);
}
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統學員行前通知】{0} {1}",
.Get訓練日期Str(, , "yyyy-MM-dd"), );
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{公司名稱}", )
.Replace("{訓練日期}", .Get訓練日期Str(, ))
.Replace("{訓練名稱}", )
.Replace("{訓練地點}", )
.Replace("{訓練時數}", .ToString())
.Replace("{課程內容}", );
mm.To.Add(new MailAddress(Email, ));
if (!string.IsNullOrEmpty(Email))
mm.ReplyTo = new MailAddress(Email, );
if ( != null)
{
mm.Attachments.Add(new Attachment(, , "octet/application"));
}
MailService.Send(mm, String.Format("學員行前通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
, .Get訓練日期Str(, , "yyyy-MM-dd"), ));
}
public void (string , string Email,
string , string , string Email, string ,
DateTime , DateTime , string , string , int , string )
{
if (string.IsNullOrEmpty(Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/學員異動通知.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統課程異動通知】{0} {1}",
.Get訓練日期Str(, , "yyyy-MM-dd"), );
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content
.Replace("{公司名稱}", )
.Replace("{訓練日期}", .Get訓練日期Str(, ))
.Replace("{訓練名稱}", )
.Replace("{訓練地點}", )
.Replace("{訓練時數}", .ToString())
.Replace("{異動內容}", );
mm.To.Add(new MailAddress(Email, ));
if (!string.IsNullOrEmpty(Email))
mm.ReplyTo = new MailAddress(Email, );
MailService.Send(mm, String.Format("學員課程異動通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
, .Get訓練日期Str(, , "yyyy-MM-dd"), ));
}
public void (Data data)
{
if (string.IsNullOrEmpty(data.Email))
return;
string content = File.ReadAllText(Context.Server.MapPath("~/Template/講師行前通知.html"));
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統講師行前通知】{0} {1}",
.Get訓練日期Str(data., data., "yyyy-MM-dd"), data.);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
content = content
.Replace("{公司名稱}", data.)
.Replace("{講師姓名}", data.)
.Replace("{訓練名稱}", data.)
.Replace("{訓練地點}", data.)
.Replace("{訓練地址}", data.)
.Replace("{是否交通圖}", CheckMark(data. != null))
.Replace("{訓練日期}", .Get訓練日期Str(data., data.))
.Replace("{訓練時間}", data.)
.Replace("{訓練時間迄}", data.)
.Replace("{備課時間}", data.)
.Replace("{聯絡人姓名}", data.)
.Replace("{聯絡人電話}", data.)
.Replace("{聯絡人Email}", data.Email)
.Replace("{受訓對象}", "")
.Replace("{是否攜帶筆電}", CheckMark(data.))
.Replace("{是否攜帶簡報}", CheckMark(data.))
.Replace("{是否攜帶其他}", CheckMark(data.))
.Replace("{攜帶其他}", data.)
.Replace("{是否場地投影機}", CheckMark(data.))
.Replace("{是否場地麥克風}", CheckMark(data.))
.Replace("{是否場地雷射筆}", CheckMark(data.))
.Replace("{是否場地筆電}", CheckMark(data.))
.Replace("{是否場地座位安排}", CheckMark(data.))
.Replace("{是否場地白紙}", CheckMark(data.))
.Replace("{是否場地其他}", CheckMark(data.))
.Replace("{場地其他}", data.)
.Replace("{是否講師費}", CheckMark(data.))
.Replace("{講師費}", data.)
.Replace("{是否交通費}", CheckMark(data.))
.Replace("{交通費}", data.)
.Replace("{合計}", data.)
.Replace("{是否現金}", CheckMark(data.))
.Replace("{是否匯款}", CheckMark(data.))
.Replace("{給付日}", data..Ticks > 0 ? data..ToString("yyyy年MM月dd日") : "")
.Replace("{是否交通安排}", CheckMark(data.))
.Replace("{交通安排}", data.)
.Replace("{是否用餐}", CheckMark(data.))
.Replace("{用餐}", data.);
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(content, Encoding.UTF8, "text/html");
mm.AlternateViews.Add(htmlView);
mm.To.Add(new MailAddress(data.Email, data.));
if (!string.IsNullOrEmpty(data.Email))
{
mm.CC.Add(new MailAddress(data.Email, data.));
mm.ReplyTo = new MailAddress(data.Email, data.);
}
if (data. != null)
{
mm.Attachments.Add(new Attachment(data., data., "octet/application"));
}
MailService.Send(mm, String.Format("講師行前通知郵件,對象={0} 訓練日期={1} 訓練名稱={2}",
data., .Get訓練日期Str(data., data., "yyyy-MM-dd"), data.));
}
private void (int ID, bool , string , string Email)
{
if (string.IsNullOrEmpty(Email))
return;
DAC_表單簽核主檔 Dao表單簽核主檔 = new DAC_表單簽核主檔();
List d = Dao表單簽核主檔.SelectOne(ID);
string content;
if (!)
content = File.ReadAllText(Context.Server.MapPath("~/Template/簽核通知.html"));
else
content = File.ReadAllText(Context.Server.MapPath("~/Template/撤簽通知.html"));
if (d.Count > 0)
{
string ID = d[0].ID格式.Replace("<br>", " ");
MailMessage mm = new MailMessage();
if (!)
mm.Subject = String.Format("【辦訓系統簽核通知】表單類別:{0} 表單:{1}", d[0].ID, ID);
else
mm.Subject = String.Format("【辦訓系統撤簽通知】表單類別:{0} 表單:{1}", d[0].ID, ID);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content.Replace("{表單類別}", d[0].ID)
.Replace("{表單}", d[0].ID格式);
mm.To.Add(new MailAddress(Email, ));
MailService.Send(mm, String.Format("辦訓系統簽核通知,對象={0} 表單類別={1} 單號={2}",
, d[0].ID, ID));
}
}
public void (int ID, string , string Email)
{
(ID, false, , Email);
}
public void (int ID, string , string Email)
{
(ID, true, , Email);
}
public void 滿(string , string Email,
string , DateTime , DateTime , string )
{
if (string.IsNullOrEmpty(Email))
return;
string Str = .Get訓練日期Str(, , "yyyy-MM-dd");
MailMessage mm = new MailMessage();
mm.Subject = "【辦訓系統】滿意度調查填寫通知";
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = false;
mm.Body = String.Format(
@"{0} 您好,
您參加的「{1}」({2})課程已結束,請於期限內填寫滿意度調查表。
請透過手機點選以下連結填寫:
{3}
感謝您的配合!
辦訓系統 敬上",
, , Str, );
mm.To.Add(new MailAddress(Email, ));
MailService.Send(mm, String.Format("滿意度催填郵件,對象={0} 課程={1}",
, ));
}
public void (int ID, string , string Email, int , string templatePath)
{
if (string.IsNullOrEmpty(Email))
return;
DAC_表單簽核主檔 Dao表單簽核主檔 = new DAC_表單簽核主檔();
List d = Dao表單簽核主檔.SelectOne(ID);
string content = File.ReadAllText(templatePath + @"\簽核跟催通知.html");
if (d.Count > 0)
{
string ID = d[0].ID格式.Replace("<br>", " ");
MailMessage mm = new MailMessage();
mm.Subject = String.Format("【辦訓系統簽核通知】表單類別:{0} 表單:{1}", d[0].ID, ID);
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content.Replace("{表單類別}", d[0].ID)
.Replace("{表單}", d[0].ID格式)
.Replace("{天數}", .ToString());
mm.To.Add(new MailAddress(Email, ));
MailService.Send(mm, String.Format("辦訓系統簽核跟催通知,對象={0} 表單類別={1} 單號={2} 天數={3}",
, d[0].ID, ID, ));
}
}
public bool (string , DateTime? , DateTime? , Item mailData, out string message)
{
try
{
message = String.Empty;
if (string.IsNullOrEmpty())
{
message = "未提供寄件人郵箱";
return false;
}
if (mailData == null)
{
message = string.Format("寄給 {0} 的未提供扣繳明細表資料", mailData.);
return false;
}
if (string.IsNullOrEmpty(mailData.))
{
message = string.Format("寄給 {0} 的未提供未提供收件人郵箱", mailData.);
return false;
}
string content = File.ReadAllText(Context.Server.MapPath("~/Template/扣繳明細郵件.html"))
.Replace("{主旨}", mailData.)
.Replace("{內文}", mailData..Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>"));
var report = new ();
report.data = mailData.;
report. = ;
report. = ;
var attachment = report.DoReport();
var attachStream = new MemoryStream(attachment);
MailMessage mm = new MailMessage();
mm.Subject = mailData..Replace("\r", "").Replace("\n", "");
mm.BodyEncoding = Encoding.UTF8;
mm.IsBodyHtml = true;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
mm.Body = content;
var = mailData..Replace("\r", "").Replace("\n", "").Trim();
var = mailData..Replace("\r", "").Replace("\n", "").Trim();
mm.To.Add(new MailAddress(, ));
mm.Attachments.Add(new Attachment(attachStream, string.Format("{0}_扣繳領據明細.xlsx", mailData.)));
MailService.Send(mm
, comment: String.Format("扣繳明細,對象={0}", mailData.)
, UpdateTable: "領據"
, KeyField: "編號"
, KeyValue: string.Join("|", mailData..Select(x => x..ToString()).ToArray())
, UpdateField: "郵件已發送"
, UpdateValue: "1"
);
return true;
}
catch (Exception ex)
{
message = ex.Message;
return false;
}
}
}
public class Data
{
public string ;
public string Email;
public string ;
public string ;
public string Email;
public string ;
public DateTime ;
public DateTime ;
public string ;
public string ;
public string ;
public string ;
public string ;
public string ;
public bool ;
public bool ;
public bool ;
public string ;
public bool ;
public bool ;
public bool ;
public bool ;
public bool ;
public bool ;
public bool ;
public string ;
public bool ;
public string ;
public bool ;
public string ;
public string ;
public bool ;
public bool ;
public DateTime ;
public bool ;
public string ;
public bool ;
public string ;
public string ;
public Stream ;
}
}