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 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
Date: 2 Aug 2026 09:36:30 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx5pKk57C96YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVCBbMV0gKDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6Lev?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7mkqTnsL3nsL3m
oLjpgJrnn6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxl
IHsgZm9udC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQw
RDA7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBi
YWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
c3R5bGU9ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQi
Pg0KICA8cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puioiuezu+e1seaciemcgOimgeaCqOew
veaguOeahOaSpOewveihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRp
bmc9IjMiIGNlbGxzcGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBj
b2xsYXBzZTsiPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwv
dGg+DQogICAgICA8dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0K
ICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAg
ICAgIDwvdGg+DQogICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVDxicj5bMV0g
KDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB
54mM5LmL6LevDQogICAgICA8L3RkPg0KICAgIDwvdHI+DQogIDwvdGFibGU+DQogIDxwPg0K
ICAgIOiri+eZu+WFpei+puioiuezu+e1seiZleeQhuaSpOewveewveaguOOAgjxiciAvPg0K
ICAgIOisneisne+8gQ0KICA8L3A+DQogIDxwPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEy
cHQiPijpgJnmmK/ns7vntbHoh6rli5XnmbzpgIHnmoTpg7Xku7bvvIzoq4vli7/lm57opoYp
PC9zcGFuPjwvcD4NCjwvYm9keT4NCjwvaHRtbD4=
@@ -0,0 +1,31 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
Date: 9 Aug 2026 06:40:50 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6JmV55CG57WQ5p6c6L+96LmkIOihqOWWru+8mltUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tIFsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKg=?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
dGQ+DQogICAgICAgIOiZleeQhue1kOaenOi/vei5pA0KICAgICAgPC90ZD4NCiAgICA8L3Ry
Pg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+
DQogICAgICAgIFtUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben
6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tPGJyPlsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLk
uYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKgNCiAgICAgIDwvdGQ+DQogICAgPC90cj4N
CiAgPC90YWJsZT4NCiAgPHA+DQogICAg6KuL55m75YWl6L6m6KiT57O757Wx6JmV55CG57C9
5qC444CCPGJyIC8+DQogICAg6Kyd6Kyd77yBDQogIDwvcD4NCiAgPHA+PHNwYW4gc3R5bGU9
ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeeahOmDteS7tu+8
jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
@@ -0,0 +1,31 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
Date: 8 Aug 2026 11:24:52 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tIFsxXSDlm6Dmh4nlrqLmiLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKg=?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0KICAgICAgPC90ZD4N
CiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQog
ICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2MV0g5Zug5oeJ5a6i5oi26ZyA5rGC5LmL5Zue
5oeJ5oqA5ben6IiH5bel5YW35oeJ55SoIC0g5qGD5ZyS54+tPGJyPlsxXSDlm6Dmh4nlrqLm
iLbpnIDmsYLkuYvlm57mh4nmioDlt6foiIflt6Xlhbfmh4nnlKgNCiAgICAgIDwvdGQ+DQog
ICAgPC90cj4NCiAgPC90YWJsZT4NCiAgPHA+DQogICAg6KuL55m75YWl6L6m6KiT57O757Wx
6JmV55CG57C95qC444CCPGJyIC8+DQogICAg6Kyd6Kyd77yBDQogIDwvcD4NCiAgPHA+PHNw
YW4gc3R5bGU9ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeea
hOmDteS7tu+8jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
@@ -0,0 +1,29 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz55Cs5am3?= <tingting@thinkyu.com>
Date: 8 Aug 2026 11:28:30 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6KiT57e05qqi6KiO5aCx5ZGKIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
dGQ+DQogICAgICAgIOiok+e3tOaqouiojuWgseWRig0KICAgICAgPC90ZD4NCiAgICA8L3Ry
Pg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+
DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICA8
L3RhYmxlPg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqJPns7vntbHomZXnkIbnsL3moLjj
gII8YnIgLz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3BhbiBzdHlsZT0iZm9u
dC1zaXplOiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE6YO15Lu277yM6KuL
5Yu/5Zue6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
@@ -0,0 +1,29 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
Date: 2 Aug 2026 09:30:00 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya6Kqy56iL5LyB5YqDIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
dGQ+DQogICAgICAgIOiqsueoi+S8geWKgw0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICAg
IDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAgICA8dGQ+DQogICAg
ICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3RyPg0KICA8L3RhYmxl
Pg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqJPns7vntbHomZXnkIbnsL3moLjjgII8YnIg
Lz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3BhbiBzdHlsZT0iZm9udC1zaXpl
OiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE6YO15Lu277yM6KuL5Yu/5Zue
6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
@@ -0,0 +1,29 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
Date: 2 Aug 2026 09:30:01 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx5pKk57C96YCa55+l44CR6KGo5Zau6aGe5Yil77ya6Kqy56iL5LyB5YqDIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVA==?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7mkqTnsL3nsL3m
oLjpgJrnn6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxl
IHsgZm9udC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQw
RDA7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBi
YWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkg
c3R5bGU9ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQi
Pg0KICA8cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puioiuezu+e1seaciemcgOimgeaCqOew
veaguOeahOaSpOewveihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRp
bmc9IjMiIGNlbGxzcGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBj
b2xsYXBzZTsiPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwv
dGg+DQogICAgICA8dGQ+DQogICAgICAgIOiqsueoi+S8geWKgw0KICAgICAgPC90ZD4NCiAg
ICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQogICAg
ICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVA0KICAgICAgPC90ZD4NCiAgICA8L3Ry
Pg0KICA8L3RhYmxlPg0KICA8cD4NCiAgICDoq4vnmbvlhaXovqboqIrns7vntbHomZXnkIbm
kqTnsL3nsL3moLjjgII8YnIgLz4NCiAgICDorJ3orJ3vvIENCiAgPC9wPg0KICA8cD48c3Bh
biBzdHlsZT0iZm9udC1zaXplOiAxMnB0Ij4o6YCZ5piv57O757Wx6Ieq5YuV55m86YCB55qE
6YO15Lu277yM6KuL5Yu/5Zue6KaGKTwvc3Bhbj48L3A+DQo8L2JvZHk+DQo8L2h0bWw+
@@ -0,0 +1,31 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?6Zmz5amJ5am3?= <tin526@hotmail.com>
Date: 2 Aug 2026 09:36:29 +0800
Subject: =?utf-8?B?44CQ6L6m6KiT57O757Wx57C95qC46YCa55+l44CR6KGo5Zau6aGe5Yil77ya5pWZ5a245pel6KqM5pqo55Ww5bi454uA5rOBIOihqOWWru+8mltUWTAwMDE2Ml0gVEVTVCBbMV0gKDEwMynpq5jnuL7mlYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6Lev?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250
ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+DQogIDx0aXRsZT7nsL3moLjpgJrn
n6U8L3RpdGxlPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIHRhYmxlIHsgZm9u
dC1zaXplOiAxNHB0IH0NCiAgICB0aCB7IGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7IGZv
bnQtd2VpZ2h0Om5vcm1hbDsgdGV4dC1hbGlnbjpsZWZ0OyB9DQogICAgdGQgeyBiYWNrZ3Jv
dW5kLWNvbG9yOiB3aGl0ZTsgfQ0KICA8L3N0eWxlPg0KPC9oZWFkPg0KPGJvZHkgc3R5bGU9
ImZvbnQtZmFtaWx5OiDmqJnmpbfpq5QsIEthaVRpOyBmb250LXNpemU6IDE0cHQiPg0KICA8
cD7mgqjlpb3vvJo8L3A+DQogIDxwPui+puiok+ezu+e1seaciemcgOimgeaCqOewveaguOea
hOihqOWWrjwvcD4NCiAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjMiIGNlbGxz
cGFjaW5nPSIwIiANCiAgICBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsiPg0K
ICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq7poZ7liKUNCiAgICAgIDwvdGg+DQogICAgICA8
dGQ+DQogICAgICAgIOaVmeWtuOaXpeiqjOaaqOeVsOW4uOeLgOazgQ0KICAgICAgPC90ZD4N
CiAgICA8L3RyPg0KICAgIDx0cj4NCiAgICAgIDx0aD7ooajllq4NCiAgICAgIDwvdGg+DQog
ICAgICA8dGQ+DQogICAgICAgIFtUWTAwMDE2Ml0gVEVTVDxicj5bMV0gKDEwMynpq5jnuL7m
lYjlnJjpmoot5omT6YCg5bm456aP5q2j5ZCR6IG35rav6aGn5ZWP5ZOB54mM5LmL6LevDQog
ICAgICA8L3RkPg0KICAgIDwvdHI+DQogIDwvdGFibGU+DQogIDxwPg0KICAgIOiri+eZu+WF
pei+puiok+ezu+e1seiZleeQhuewveaguOOAgjxiciAvPg0KICAgIOisneisne+8gQ0KICA8
L3A+DQogIDxwPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEycHQiPijpgJnmmK/ns7vntbHo
h6rli5XnmbzpgIHnmoTpg7Xku7bvvIzoq4vli7/lm57opoYpPC9zcGFuPjwvcD4NCjwvYm9k
eT4NCjwvaHRtbD4=
@@ -0,0 +1,131 @@
X-Sender: neo.sryang@gmail.com
X-Receiver: =?utf-8?B?5qWK5qi55Lq6?= <neo.sryang@gmail.com>
MIME-Version: 1.0
From: neo.sryang@gmail.com
To: =?utf-8?B?5qWK5qi55Lq6?= <neo.sryang@gmail.com>
Date: 14 Mar 2026 14:43:38 +0800
Subject: =?utf-8?B?6YCZ5piv5omj57mz5piO57Sw?=
Content-Type: multipart/mixed; boundary=--boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
PCFET0NUWVBFIGh0bWw+DQo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94
aHRtbCI+DQo8aGVhZD4NCiAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv
bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4NCiAgICA8dGl0bGU+6YCZ5piv
5omj57mz5piO57SwPC90aXRsZT4NCiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAg
ICAgICB0YWJsZSB7DQogICAgICAgICAgICBmb250LXNpemU6IDE0cHQNCiAgICAgICAgfQ0K
DQogICAgICAgIHRoIHsNCiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNEMEQwRDA7
DQogICAgICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOw0KICAgICAgICAgICAgdGV4dC1h
bGlnbjogbGVmdDsNCiAgICAgICAgfQ0KDQogICAgICAgIHRkIHsNCiAgICAgICAgICAgIGJh
Y2tncm91bmQtY29sb3I6IHdoaXRlOw0KICAgICAgICB9DQogICAgPC9zdHlsZT4NCjwvaGVh
ZD4NCjxib2R5IHN0eWxlPSJmb250LWZhbWlseTog5qiZ5qW36auULCBLYWlUaTsgZm9udC1z
aXplOiAxNHB0Ij4NCiAgICA8cD7oq4vlj4PplrHpmYTku7Y8L3A+DQogICAgPHA+PHNwYW4g
c3R5bGU9ImZvbnQtc2l6ZTogMTJwdCI+KOmAmeaYr+ezu+e1seiHquWLleeZvOmAgeeahOmD
teS7tu+8jOiri+WLv+Wbnuimhik8L3NwYW4+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg==
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385
Content-Type: application/octet-stream; name="=?utf-8?B?5qWK5qi55Lq6X+aJo+e5s+mgmOaTmuaYjue0sC54bHN4?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?UTF-8?B?5qWK5qi55Lq6X+aJo+e5s+mgmOaTmuaYjue0sC54bHN4?="
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
----boundary_1_0cbb6cef-d3c8-4239-b68e-b3891c4f5385--
+13
View File
@@ -0,0 +1,13 @@
# All files
[*]
indent_style = space
# Xml files
[*.xml]
indent_size = 2
# 設定所有文字檔案使用 UTF-8 編碼
[*]
charset = utf-8-bom
@@ -0,0 +1,29 @@
<!--
您可以在 <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 找到現有的瀏覽器定義
-->
<browsers>
<browser id="Safari" parentID="Safari1Plus">
<identification>
<userAgent match="Safari/\d+\.\d+" />
</identification>
<capture>
<userAgent match="Version/(?'version'\d+\.\d+)" />
</capture>
<capabilities>
<capability name="browser" value="Safari" />
<capability name="version" value="${version}" />
</capabilities>
<controlAdapters>
<adapter controlType="System.Web.UI.WebControls.Menu"
adapterType="" />
</controlAdapters>
</browser>
<browser id="GoogleChrome" parentID="Safari">
<identification>
<userAgent match="Chrome/(?'version'\d+\.\d+)" />
</identification>
<capabilities>
<capability name="browser" value="Googlebot" />
</capabilities>
</browser>
</browsers>
@@ -0,0 +1,547 @@
a.button, button, input[type=button], submit, input[type=submit] {
color: #000000;
padding: 0;
margin: 2px;
/* height: 25px; */
line-height: 25px;
display: inline-block;
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
text-decoration: none;
vertical-align: top;
text-align: center;
background-repeat: no-repeat;
background-position: 0 0;
/* 圓角 */
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px
}
a.button:hover, button:hover, input[type=button]:hover, submit:hover, input[type=submit]:hover {
font-weight: bold;
}
a.blue120, button.blue120, input[type=button].blue120, submit.blue120, input[type=submit].blue120 {
width: 120px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange120, button.orange120, input[type=button].orange120, submit.orange120, input[type=submit].orange120 {
width: 120px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red120, button.red120, input[type=button].red120, submit.red120, input[type=submit].red120 {
width: 120px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green120, button.green120, input[type=button].green120, submit.green120, input[type=submit].green120 {
width: 120px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple120, button.purple120, input[type=button].purple120, submit.purple120, input[type=submit].purple120 {
width: 120px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray120, button.gray120, input[type=button].gray120, submit.gray120, input[type=submit].gray120 {
width: 120px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow120, button.yellow120, input[type=button].yellow120, submit.yellow120, input[type=submit].yellow120 {
width: 120px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.blue100, button.blue100, input[type=button].blue100, submit.blue100, input[type=submit].blue100 {
width: 100px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange100, button.orange100, input[type=button].orange100, submit.orange100, input[type=submit].orange100 {
width: 100px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red100, button.red100, input[type=button].red100, submit.red100, input[type=submit].red100 {
width: 100px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green100, button.green100, input[type=button].green100, submit.green100, input[type=submit].green100 {
width: 100px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple100, button.purple100, input[type=button].purple100, submit.purple100, input[type=submit].purple100 {
width: 100px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray100, button.gray100, input[type=button].gray100, submit.gray100, input[type=submit].gray100 {
width: 100px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow100, button.yellow100, input[type=button].yellow100, submit.yellow100, input[type=submit].yellow100 {
width: 100px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.blue80, button.blue80, input[type=button].blue80, submit.blue80, input[type=submit].blue80 {
width: 80px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange80, button.orange80, input[type=button].orange80, submit.orange80, input[type=submit].orange80 {
width: 80px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red80, button.red80, input[type=button].red80, submit.red80, input[type=submit].red80 {
width: 80px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green80, button.green80, input[type=button].green80, submit.green80, input[type=submit].green80 {
width: 80px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple80, button.purple80, input[type=button].purple80, submit.purple80, input[type=submit].purple80 {
width: 80px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray80, button.gray80, input[type=button].gray80, submit.gray80, input[type=submit].gray80 {
width: 80px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow80, button.yellow80, input[type=button].yellow80, submit.yellow80, input[type=submit].yellow80 {
width: 80px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.blue60, button.blue60, input[type=button].blue60, submit.blue60, input[type=submit].blue60 {
width: 60px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange60, button.orange60, input[type=button].orange60, submit.orange60, input[type=submit].orange60 {
width: 60px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red60, button.red60, input[type=button].red60, submit.red60, input[type=submit].red60 {
width: 60px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green60, button.green60, input[type=button].green60, submit.green60, input[type=submit].green60 {
width: 60px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple60, button.purple60, input[type=button].purple60, submit.purple60, input[type=submit].purple60 {
width: 60px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray60, button.gray60, input[type=button].gray60, submit.gray60, input[type=submit].gray60 {
width: 60px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow60, button.yellow60, input[type=button].yellow60, submit.yellow60, input[type=submit].yellow60 {
width: 60px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.blue40, button.blue40, input[type=button].blue40, submit.blue40, input[type=submit].blue40 {
width: 40px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange40, button.orange40, input[type=button].orange40, submit.orange40, input[type=submit].orange40 {
width: 40px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red40, button.red40, input[type=button].red40, submit.red40, input[type=submit].red40 {
width: 40px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green40, button.green40, input[type=button].green40, submit.green40, input[type=submit].green40 {
width: 40px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple40, button.purple40, input[type=button].purple40, submit.purple40, input[type=submit].purple40 {
width: 40px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray40, button.gray40, input[type=button].gray40, submit.gray40, input[type=submit].gray40 {
width: 40px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow40, button.yellow40, input[type=button].yellow40, submit.yellow40, input[type=submit].yellow40 {
width: 40px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.blue28, button.blue28, input[type=button].blue28, submit.blue28, input[type=submit].blue28 {
width: 28px;
color: #2172B5;
border: 1px solid #2172B5;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#8CC6EF,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -ms-linear-gradient(top, #8CC6EF, #FFFFFF);
background: -linear-gradient(top, #8CC6EF, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#8CC6EF), to(#FFFFFF));
background: -o-linear-gradient(top, #8CC6EF, #FFFFFF)
}
a.orange28, button.orange28, input[type=button].orange28, submit.orange28, input[type=submit].orange28 {
width: 28px;
color: #B25300;
border: 1px solid #B25300;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FFAA5F,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -ms-linear-gradient(top, #FFAA5F, #FFFFFF);
background: -linear-gradient(top, #FFAA5F, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FFAA5F), to(#FFFFFF));
background: -o-linear-gradient(top, #FFAA5F, #FFFFFF)
}
a.red28, button.red28, input[type=button].red28, submit.red28, input[type=submit].red28 {
width: 28px;
color: #A71717;
border: 1px solid #A71717;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F4B4B4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -ms-linear-gradient(top, #F4B4B4, #FFFFFF);
background: -linear-gradient(top, #F4B4B4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F4B4B4), to(#FFFFFF));
background: -o-linear-gradient(top, #F4B4B4, #FFFFFF)
}
a.green28, button.green28, input[type=button].green28, submit.green28, input[type=submit].green28 {
width: 28px;
color: #055705;
border: 1px solid #055705;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#6EF66E,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #6EF66E, #FFFFFF);
background: -ms-linear-gradient(top, #6EF66E, #FFFFFF);
background: -linear-gradient(top, #6EF66E, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#6EF66E), to(#FFFFFF));
background: -o-linear-gradient(top, #6EF66E, #FFFFFF)
}
a.purple28, button.purple28, input[type=button].purple28, submit.purple28, input[type=submit].purple28 {
width: 28px;
color: #800080;
border: 1px solid #800080;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#F694F4,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #F694F4, #FFFFFF);
background: -ms-linear-gradient(top, #F694F4, #FFFFFF);
background: -linear-gradient(top, #F694F4, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#F694F4), to(#FFFFFF));
background: -o-linear-gradient(top, #F694F4, #FFFFFF)
}
a.gray28, button.gray28, input[type=button].gray28, submit.gray28, input[type=submit].gray28 {
width: 28px;
color: #303030;
border: 1px solid #A7A7A7;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#D0D0D0,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -ms-linear-gradient(top, #D0D0D0, #FFFFFF);
background: -linear-gradient(top, #D0D0D0, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#D0D0D0), to(#FFFFFF));
background: -o-linear-gradient(top, #D0D0D0, #FFFFFF)
}
a.yellow28, button.yellow28, input[type=button].yellow28, submit.yellow28, input[type=submit].yellow28 {
width: 28px;
color: #97A004;
border: 1px solid #97A004;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr=#FAFFA3,endColorStr=#FFFFFF,gradientType=0);
background: -moz-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -ms-linear-gradient(top, #FAFFA3, #FFFFFF);
background: -linear-gradient(top, #FAFFA3, #FFFFFF);
background: -webkit-gradient(linear, left top, left bottom, from(#FAFFA3), to(#FFFFFF));
background: -o-linear-gradient(top, #FAFFA3, #FFFFFF)
}
a.pickupbutton {
width: 16px;
height: 16px;
background-image: Url("Img/pickup.gif");
}
a[disabled="disabled"], a.button[disabled="disabled"], button[disabled="disabled"], input[type=button][disabled="disabled"], submit[disabled="disabled"], input[type=submit][disabled="disabled"] {
color: #808080;
border: 1px solid #909090;
FILTER: initial;
background: none;
background-color: #E0E0E0;
}
a[disabled="disabled"]:hover {
font-weight: normal;
cursor: default;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 664 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 882 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 861 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

@@ -0,0 +1,49 @@
/* Loading 遮罩樣式 */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0);
display: flex;
justify-content: center;
align-items: center;
z-index: 10000;
}
.loading-spinner {
background-color: white;
padding: 40px;
border-radius: 8px;
text-align: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
}
.loading-spinner p {
margin-top: 15px;
color: #333;
font-size: 16px;
font-weight: 500;
}
/* 轉圈圈動畫 */
.spinner {
width: 50px;
height: 50px;
border: 4px solid #cccccc;
border-top: 4px solid #ffffff;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
@@ -0,0 +1,45 @@
a.menu {
display: inline-block;
color: Black;
width: 100%;
height: 27px;
line-height: 26px;
vertical-align: top;
overflow: hidden;
text-align: left;
cursor: pointer !important;
z-index: 999;
}
a.menu_toplevel {
display: inline-block;
color: White;
width: 100%;
height: 27px;
line-height: 26px;
vertical-align: top;
text-align: left;
cursor: pointer !important;
z-index: 999;
}
a.menuSelected {
display: inline-block;
color: White;
width: 100%;
height: 27px;
line-height: 26px;
vertical-align: top;
text-align: left;
z-index: 999;
}
a.menu:hover {
color: White;
background-color: #007ACC;
}
a.menu_toplevel:hover {
color: White;
background-color: #007ACC;
}
@@ -0,0 +1,105 @@
div.popup_title_left_corner
{
padding:0;
margin:0;
width: 3px;
height:27px;
background-image:url("Img/window_caption_left_corner.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_title_right_corner
{
padding:0;
margin:0;
width: 3px;
height: 27px;
background-image:url("Img/window_caption_right_corner.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_title_left
{
padding:0;
margin:0;
width: 4px;
height:27px;
background-image:url("Img/window_caption_left.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_title_right
{
padding:0;
margin:0;
width: 4px;
height:27px;
background-image:url("Img/window_caption_right.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_title
{
padding:0;
margin:0;
height:27px;
background-image:url("Img/window_caption.gif");
background-repeat:repeat-x;
float:left;
}
div.popup_left_border
{
padding:0;
margin:0;
width:3px;
background-image:url("Img/window_left_border.gif");
background-repeat:repeat-y;
float:left;
}
div.popup_right_border
{
padding:0;
margin:0;
width:3px;
background-image:url("Img/window_right_border.gif");
background-repeat:repeat-y;
float:left;
}
div.popup_lower_left_corner
{
padding:0;
margin:0;
width:3px;
height:3px;
background-image:url("Img/window_lower_left_corner.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_lower_right_corner
{
padding:0;
margin:0;
width:3px;
height:3px;
background-image:url("Img/window_lower_right_corner.gif");
background-repeat:no-repeat;
float:left;
}
div.popup_lower_border
{
padding:0;
margin:0;
height:3px;
background-image:url("Img/window_lower_border.gif");
background-repeat:repeat-x;
float:left;
}
@@ -0,0 +1,107 @@
<%--
預設面板範本。下列面板僅提供做為範例的用途。
1. 具名控制面板。SkinId 應為唯一定義,因為在相同主題中,一個控制項型別不能具有重複的 SkinId。
<asp:GridView runat="server" SkinId="gridviewSkin" BackColor="White" >
<AlternatingRowStyle BackColor="Blue" />
</asp:GridView>
2. 預設面板。SkinId 未定義。在相同主題中,每個控制項型別只能有一個預設控制面板。
<asp:Image runat="server" ImageUrl="~/images/image1.jpg" />
--%>
<%@ Register Assembly="WebLib" Namespace="WebLib" TagPrefix="weblib" %>
<asp:GridView runat="server"
BackColor="White"
BorderColor="#B0B0B0"
BorderStyle="Solid"
BorderWidth="1px"
CellPadding="3"
EnableModelValidation="True"
ForeColor="Black"
GridLines="Vertical"
CSSClass="gridview">
<RowStyle
BorderColor="#B0B0B0" />
<AlternatingRowStyle
BorderColor="#B0B0B0"
BackColor="#EEEEEE" />
<FooterStyle
BorderColor="#B0B0B0"
BackColor="#B7DEFC" />
<HeaderStyle
BorderColor="#B0B0B0"
BackColor="#B7DEFC" />
<PagerStyle
BorderWidth="1px"
BorderColor="#B0B0B0"
BackColor="#DDDDDD"
HorizontalAlign="Right" />
<SelectedRowStyle
BorderColor="#B0B0B0"
BackColor="#95D1FF" />
<EditRowStyle
BorderColor="#B0B0B0"
BackColor="#95D1FF" />
</asp:GridView>
<asp:TreeView
runat="server">
<HoverNodeStyle
Font-Underline="False"
ForeColor="#FFFFFF"
BackColor="#007ACC" />
<NodeStyle
Font-Size="12pt"
ForeColor="Black"
HorizontalPadding="4px"
NodeSpacing="0px"
VerticalPadding="0px"
Height="22px"
CssClass="menu"
Width="100%" />
<ParentNodeStyle
CssClass="menu"
Width="100%"
Font-Bold="False" />
<SelectedNodeStyle
Font-Underline="False"
ForeColor="#FFFFFF"
BackColor="#007ACC"
HorizontalPadding="4px"
VerticalPadding="0px"
CssClass="menuSelected" />
<RootNodeStyle
CssClass="menu"
Width="100%" />
</asp:TreeView>
<asp:FormView runat="server"
CssClass="formview">
</asp:FormView>
<asp:Menu runat="server"
Orientation="Horizontal"
Font-Overline="False"
StaticEnableDefaultPopOutImage="False"
StaticSubMenuIndent="0"
DynamicHorizontalOffset="0"
DynamicVerticalOffset="0"
StaticItemFormatString="&nbsp;&nbsp;{0}&nbsp;&nbsp;"
DynamicItemFormatString="&nbsp;&nbsp;{0}&nbsp;&nbsp;"
SkipLinkText="" >
<StaticMenuItemStyle CssClass="menu_toplevel" />
<StaticSelectedStyle BackColor="#007ACC" ForeColor="White" />
<DynamicMenuItemStyle CssClass="menu" BackColor="#89CEFF" ForeColor="White" />
<DynamicSelectedStyle BackColor="#007ACC" ForeColor="White" />
</asp:Menu>
<weblib:DateTextBox runat="server"
DateSeparator=""
DateOrder="YMD" />
<weblib:GridViewPager runat="server"
ButtonCssClass="button gray60" />
@@ -0,0 +1,372 @@
body, div, table {
padding: 0;
margin: 0;
}
body {
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
background-color: #eee;
}
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"]),
textarea,
select {
padding: 3px;
border: solid 1px #ccc;
border-radius: 3px;
}
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"])[readonly],
input:where([type="text"], [type="password"], [type="date"], [type="datetime"], [type="number"])[disabled],
textarea[readonly],
textarea[disabled],
select[disabled] {
background-color: #ccc;
}
/*select {
padding: 3px;
height: 1.7em;
background-color: #FFF;
}
*/
.hide {
display: none;
}
.background {
width: 100%;
text-align: center;
background-image: url('img/outbg.gif');
}
.ta-center {
text-align: center;
}
.ta-left {
text-align: left;
}
.ta-right {
text-align: right;
}
.timeText {
font-size: 12pt;
color: Black;
}
.labelCell {
text-align: right;
}
.displayCell {
background-color: #C6E8FF;
}
.inputCell {
background-color: White;
}
input {
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
word-break: break-all;
box-sizing: border-box;
}
input[type="text"]:focus {
background-color: #FFFFD0;
}
input[type="password"]:focus {
background-color: #FFFFD0;
}
textarea {
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
word-break: break-all;
line-height: 1.5em;
}
textarea:focus {
background-color: #FFFFD0;
}
select {
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
margin-right: 0;
height: auto;
}
.inputFull {
width: 100%;
margin: 0;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
_box-sizing: border-box;
word-break: break-all;
-ms-word-break: break-all;
}
.inputFullBlock {
width: 100%;
height: 100%;
margin: 0;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
_box-sizing: border-box;
font-size: 12pt;
}
a.hiddenLink {
text-decoration: none;
color: Black;
}
a.hiddenLink:hover {
color: Blue;
}
.functionTitle {
font-size: 14pt;
font-weight: bold;
color: #004d7a;
padding-top: 6px;
padding-bottom: 6px;
}
.marqueeText {
font-size: 12pt;
font-weight: bolder;
color: Red;
}
.groupHeaderCell {
text-align: center;
border-bottom-style: solid;
border-bottom-width: 1px;
border-bottom-color: black;
}
.FunctionName {
color: #2472B2;
font-size: 12pt;
font-weight: bold;
}
.ErrorMessage {
color: red;
font-size: 12pt;
font-weight: bold;
}
a.LogoutButton {
height: 32px;
width: 32px;
background-image: Url("Img/logout.png");
background-repeat: no-repeat;
background-position: 0 0;
}
a.election {
color: Blue;
font-weight: bold;
}
a.cancelelection {
color: Blue;
font-weight: bold;
}
.padding0 {
padding: 0;
}
.padding3 {
padding: 3px;
}
.padding5 {
padding: 5px;
}
.minwidth10 {
min-width: 10px;
}
.minwidth20 {
min-width: 20px;
}
.minwidth30 {
min-width: 30px;
}
.minwidth40 {
min-width: 40px;
}
.minwidth50 {
min-width: 50px;
}
.minwidth60 {
min-width: 60px;
}
.minwidth70 {
min-width: 70px;
}
.minwidth80 {
min-width: 80px;
}
.minwidth90 {
min-width: 90px;
}
.minwidth100 {
min-width: 100px;
}
.minwidth110 {
min-width: 110px;
}
.minwidth120 {
min-width: 120px;
}
.minwidth130 {
min-width: 130px;
}
.minwidth140 {
min-width: 140px;
}
.minwidth150 {
min-width: 150px;
}
.minwidth160 {
min-width: 160px;
}
.minwidth170 {
min-width: 170px;
}
.minwidth180 {
min-width: 180px;
}
.minwidth190 {
min-width: 190px;
}
.minwidth200 {
min-width: 200px;
}
.maxwidth10 {
max-width: 10px;
}
.maxwidth20 {
max-width: 20px;
}
.maxwidth30 {
max-width: 30px;
}
.maxwidth40 {
max-width: 40px;
}
.maxwidth50 {
max-width: 50px;
}
.maxwidth60 {
max-width: 60px;
}
.maxwidth70 {
max-width: 70px;
}
.maxwidth80 {
max-width: 80px;
}
.maxwidth90 {
max-width: 90px;
}
.maxwidth100 {
max-width: 100px;
}
.maxwidth110 {
max-width: 110px;
}
.maxwidth120 {
max-width: 120px;
}
.maxwidth130 {
max-width: 130px;
}
.maxwidth140 {
max-width: 140px;
}
.maxwidth150 {
max-width: 150px;
}
.maxwidth160 {
max-width: 160px;
}
.maxwidth170 {
max-width: 170px;
}
.maxwidth180 {
max-width: 180px;
}
.maxwidth190 {
max-width: 190px;
}
.maxwidth200 {
max-width: 200px;
}
.phraselink {
text-decoration: none;
margin-right: 1em;
color: #007ACC;
cursor: pointer;
display: inline-block;
}
.phraselink:hover {
background-color: #007ACC;
color: #FFF;
}
@@ -0,0 +1,36 @@
/* 頁籤樣式 */
a.tabButton
{
font-size: 12pt;
text-decoration : none;
text-align:center;
padding-top: 0px;
display: inline-block;
vertical-align: top;
width: 179px;
height: 27px;
line-height: 24px;
background-image: Url("Img/TabYellow.png");
background-repeat: no-repeat;
background-position: 0 0;
color : Black;
font-weight: normal;
}
a.tabButtonSelected
{
font-size: 12pt;
text-decoration : none;
text-align: center;
padding-top: 0px;
display: inline-block;
vertical-align: top;
width: 179px;
height: 27px;
line-height: 24px;
background-image: Url("Img/TabYellow.png");
background-repeat: no-repeat;
background-position: 0 -27px;
color : Black;
font-weight: normal;
}
@@ -0,0 +1,90 @@
table {
font-family: Arial, Helvetica, sans-serif, "Microsoft JhengHei", "Microsoft YaHei", MingLiU, SimSun;
font-size: 12pt;
border-collapse: separate;
border-spacing: 0;
margin-bottom: 0;
}
table.formview table {
border-collapse: separate;
border-spacing: 2px;
}
table.fixedwithborder {
table-layout: fixed;
border-collapse: collapse;
border: 1px solid #DDD;
}
table.fixedwithoutborder {
table-layout: fixed;
border-collapse: collapse;
border: 0;
}
table.autowidth {
table-layout: auto;
}
th {
padding: 3px;
text-align: center;
background-color: #DDDDDD;
font-weight: normal;
color: Black;
border: 1px solid #DDD;
word-break: break-all;
}
td {
word-break: break-all;
}
td.caption {
padding: 3px;
text-align: right;
background-color: #FFFFFF;
word-break: break-all;
}
td.captionCenter {
padding: 3px;
text-align: center;
background-color: #FFFFFF;
word-break: break-all;
}
td.captionLeft {
padding: 3px;
text-align: left;
background-color: #FFFFFF;
word-break: break-all;
}
td.datainput {
padding: 3px;
}
td.datadisplay {
padding: 5px;
background-color: #DEF0FC;
word-wrap: break-word;
word-break: break-all;
}
td.widthcontrol {
padding: 0;
margin: 0;
height: 0;
font-size: 0;
}
table.gridview {
border-collapse: collapse;
}
table.gridview tr th, td {
border-left-color: #DDD;
border-right-color: #DDD;
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,70 @@
/* 警告訊息進入動畫 */
@keyframes slideDown {
from {
opacity: 0;
transform: translateY(-10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* Toast 進入動畫 */
@keyframes slideIn {
from {
transform: translateX(400px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
/* Toast 訊息容器樣式 */
.toast-message {
position: fixed;
top: 20px;
right: 20px;
padding: 15px 20px;
border-radius: 4px;
color: white;
font-weight: 500;
z-index: 9999;
animation: slideIn 0.3s ease-out;
max-width: 400px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
word-wrap: break-word;
word-break: break-word;
}
/* Toast 訊息類型樣式 */
.toast-success {
background-color: #28a745;
}
.toast-error {
background-color: #dc3545;
}
.toast-warning {
background-color: #ffc107;
color: #333;
}
.toast-info {
background-color: #17a2b8;
}
/* Vue transition 動畫 */
.toast-enter-active, .toast-leave-active {
transition: all 0.3s ease;
}
.toast-enter, .toast-leave-to {
transform: translateX(100%);
opacity: 0;
}
+80
View File
@@ -0,0 +1,80 @@
using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
namespace Education
{
public class EncDec
{
/// <summary>
/// WLIB 新版密碼的加密函數
/// </summary>
/// <param name="S">欲加密之密碼字串,最大長度 8 位,僅可包含A-Z、a-z、0-9</param>
/// <returns>加密後之密碼字串</returns>
public static string KeyEnc(string S)
{
int k1 = 0;
int k2 = 0;
int i, j;
Random rnd = new Random(DateTime.UtcNow.AddHours(8).Millisecond);
byte[] inBuf = new byte[8];
byte[] outBuf = new byte[10];
string tmp;
while (true)
{
k1 = rnd.Next(31);
k2 = rnd.Next(31);
outBuf[0] = (byte)(k1 + 44);
outBuf[9] = (byte)(k2 + 66);
if (S.Length < 8)
inBuf = Encoding.ASCII.GetBytes(S.PadRight(8));
else
inBuf = Encoding.ASCII.GetBytes(S);
for (i = 1; i <= 8; i++)
{
j = (k1 % 31) + i;
j = ((k2 + j) % 31) + 1;
outBuf[i] = (byte)(inBuf[i - 1] ^ j);
}
tmp = Encoding.ASCII.GetString(outBuf);
if (tmp.IndexOf('\'') < 0 && tmp.IndexOf('"') < 0)
break;
}
return tmp;
}
/// <summary>
/// WLIB 新版密碼的解密函數
/// </summary>
/// <param name="S">欲解密之密碼字串,固定 10 位</param>
/// <returns>解密後之密碼字串。若參數 S 長度不是 10 位,則傳回".." + S + ".."</returns>
public static string KeyDec(string S)
{
int i, j;
int Key1, Key2;
byte[] inBuf;
byte[] outBuf = new byte[8];
if (S.Length != 10)
return ".." + S + "..";
//解密
inBuf = Encoding.ASCII.GetBytes(S);
Key1 = inBuf[0] - 44;
Key2 = inBuf[9] - 66;
for (i = 1; i <= 8; i++)
{
j = Key1 % 31 + i;
j = (Key2 + j) % 31 + 1;
outBuf[i - 1] = (byte)(inBuf[i] ^ j);
}
return Encoding.ASCII.GetString(outBuf).Trim();
}
}
}
@@ -0,0 +1,211 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Timers;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using WebLib;
namespace Education
{
public class FollowService
{
private static FollowService _instance = null;
private Timer _timer = null;
private static int _interval = 30;
private static string _doWorkTime = "00:00";
private static bool _enabled = false;
private static bool _busy = false;
private static = new ();
private DAC_BPSN Dao員工;
private DbConnection conn;
/// <summary>
/// 發動時間,預設值為 00:00
/// </summary>
public static string DoWorkTime
{
get
{
return _doWorkTime;
}
set
{
_doWorkTime = value;
}
}
/// <summary>
/// 郵件模版路徑
/// </summary>
public static string TemplatePath { get; set; }
/// <summary>
/// 設定或取得簽核跟催服務是否啟動
/// </summary>
public static bool Enabled
{
get
{
return _enabled;
}
set
{
if (value)
{
if (_enabled)
return;
Instance._timer.Interval = _interval * 1000;
Instance._timer.AutoReset = true;
Instance._timer.Enabled = true;
_enabled = true;
}
else
{
if (!_enabled)
return;
_enabled = false;
Instance._timer.Enabled = false;
}
}
}
private FollowService()
{
_timer = new Timer();
_timer.Enabled = false;
_timer.Elapsed += new ElapsedEventHandler(DoFollowWork);
conn = DAC.NewConnection();
Dao員工 = new DAC_BPSN(conn);
}
public static FollowService Instance
{
get
{
if (_instance == null)
_instance = new FollowService();
return _instance;
}
}
private void DoFollowWork(object sender, ElapsedEventArgs e)
{
string nowTime = DateTime.UtcNow.AddHours(8).ToString("HH:mm");
if (nowTime.CompareTo(_doWorkTime) == 0 && !_busy)
{
_busy = true;
try
{
DAC_表單簽核明細 dao表單簽核明細 = new DAC_表單簽核明細(conn);
List first = dao表單簽核明細.Select第一次稽催();
List second = dao表單簽核明細.Select第二次稽催();
List third = dao表單簽核明細.Select第三次稽催();
foreach ( item in first)
{
SendFollowMail(item, 3);
item. = 1;
dao表單簽核明細.UpdateOne(item);
}
foreach ( item in second)
{
SendFollowMail(item, 7);
item. = 2;
dao表單簽核明細.UpdateOne(item);
}
foreach ( item in third)
{
SendFollowMail(item, 14);
item. = 3;
dao表單簽核明細.UpdateOne(item);
}
DoSurveyReminderWork();
}
finally
{
_busy = false;
}
}
}
private void SendFollowMail( item, int )
{
string = Dao員工.Get電子郵件(item.);
string = Dao員工.Get員工姓名(item.);
= new ();
.(item.ID, , , , TemplatePath);
}
private void DoSurveyReminderWork()
{
if (string.IsNullOrEmpty(PublicVariable.SiteBaseUrl))
return;
string = PublicVariable.SiteBaseUrl + "/MobileSurvey/Login.aspx";
int deadlineDays = PublicVariable.SurveyReminderDeadlineDays;
DateTime minDate = PublicVariable.SurveyReminderMinCourseDate;
string[] excludeEmps = PublicVariable.SurveyReminderExcludeEmployees
.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
DbCommand cmd = conn.CreateCommand();
cmd.CommandText =
@"select A.學員編號, A.訓練課程編號, C.BPNME as 學員姓名, C.BPEML as 電子郵件,
B.顯示編號, B.訓練名稱, B.訓練日期, B.訓練日期迄
from 課程報名 A
inner join 訓練課程企劃 B on A.訓練課程編號 = B.編號
inner join BPSNView C on A.學員編號 = C.BPENO
where (A.報名狀態 = 'Y' or A.報名狀態 = 'R')
and B.訓練日期 >= @MinCourseDate
and (A.滿意度催填狀態 is null or A.滿意度催填狀態 = '')
and not exists (
select 1 from 滿意度調查 D
where D.訓練課程企劃編號 = A.訓練課程編號 and D.學員編號 = A.學員編號
)
and dateadd(day, @DeadlineDays, B.訓練日期迄) < getdate()
order by A.學員編號";
cmd.Parameters.Add(new SqlParameter("@MinCourseDate", minDate));
cmd.Parameters.Add(new SqlParameter("@DeadlineDays", deadlineDays));
DataTable dt = new DataTable();
using (var reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
foreach (DataRow row in dt.Rows)
{
string = DAC.GetString(row["學員編號"]);
if (excludeEmps.Contains())
continue;
string = DAC.GetString(row["學員姓名"]);
string = DAC.GetString(row["電子郵件"]);
string = DAC.GetString(row["訓練名稱"]);
DateTime = DAC.GetDateTime(row["訓練日期"]);
DateTime = DAC.GetDateTime(row["訓練日期迄"]);
int = DAC.GetInt32(row["訓練課程編號"]);
= new ();
.滿(, , , , , );
DbCommand cmdUpd = conn.CreateCommand();
cmdUpd.CommandText =
"update 課程報名 set 滿意度催填狀態 = 'Y'" +
" where 訓練課程編號 = @訓練課程編號 and 學員編號 = @學員編號";
cmdUpd.Parameters.Add(new SqlParameter("@訓練課程編號", ));
cmdUpd.Parameters.Add(new SqlParameter("@學員編號", ));
cmdUpd.ExecuteNonQuery();
}
}
}
}
@@ -0,0 +1,255 @@
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Web;
using System.Web.UI.WebControls;
using WebLib;
namespace Education
{
public class PublicVariable : WebLib.PublicVariable
{
private static Random r = new Random();
// 常用變數
public static string[] = { "\r\n" };
#region SESSION
public const string CompanyId = "CompanyId";
public const string EmployeeId = "EmployeeId";
public const string EmployeeName = "EmployeeName";
public const string EmployeeFunction = "EmployeeFunction";
public const string CurrentPlace = "CurrentPlace";
public const string CurrentPlaceName = "CurrentPlaceName";
public const string UserGroups = "UserGroups";
public const string EventPicturePath = "~/Upload/Event/";
public const string BulletinAttachPath = "~/Upload/Attach/";
public const string IsManager = "IsManager";
public const string IsWorker = "IsWorker";
public const string IsBackend = "IsBackend";
#endregion
#region /
public const string = "~/PhotoUpload/Teacher/";
public const string = "~/PhotoUpload/Place/";
public const string = "~/PhotoUpload/Class/";
public const string = "~/DocUpload/Certificate/";
public const string = "~/DocUpload/Communication/";
#endregion
#region Global.asax web.config
/// <summary>
/// 系統名稱
/// </summary>
public static string SystemName = "Education";
/// <summary>
/// 未登入時開放某些功能
/// </summary>
public static bool NoLoginFunction = false;
/// <summary>
/// 是否為偵錯模式,會將系統錯誤訊息顯示在網頁上
/// </summary>
public static bool DEBUG = true;
/// <summary>
/// 管理員群組
/// </summary>
public static string ManagerGroup = "'TR01'";
/// <summary>
/// 承辦人群組
/// </summary>
public static string WorkerGroup = "'TR02'";
/// <summary>
/// 總管理處ID
/// </summary>
public static int ID = 2;
/// <summary>
/// 人資部ID
/// </summary>
public static int ID = 56;
/// <summary>
/// 財務部ID
/// </summary>
public static int ID = 60;
/// <summary>
/// 是否使用 SSL 登入發郵件
/// </summary>
public static bool SendMailBySSL = false;
/// <summary>
/// 郵件發送主機
/// </summary>
public static string SendMailHost = "";
/// <summary>
/// 郵件發送通訊埠,不使用 SSL 的通常是 25,使用 SSL 的通常是 465
/// </summary>
public static int SendMailPort = 25;
/// <summary>
/// 郵件發送帳號
/// </summary>
public static string SendMailUserName = "";
/// <summary>
/// 郵件發送密碼
/// </summary>
public static string SendMailPassword = "";
#region 滿調
public const string SurveyReminderDeadlineDaysKey = "SurveyReminderDeadlineDays";
public const string SurveyReminderExcludeEmployeesKey = "SurveyReminderExcludeEmployees";
public const string SurveyReminderMinCourseDateKey = "SurveyReminderMinCourseDate";
public const string SiteBaseUrlKey = "SiteBaseUrl";
/// <summary>
/// 上課後幾天內要填寫滿意度調查
/// </summary>
public static int SurveyReminderDeadlineDays = 10;
/// <summary>
/// 排除催填的員工編號(逗號分隔)
/// </summary>
public static string SurveyReminderExcludeEmployees = "00002,00003";
/// <summary>
/// 只催填此日期之後的課程
/// </summary>
public static DateTime SurveyReminderMinCourseDate = new DateTime(2026, 7, 1);
/// <summary>
/// 站台基礎 URL(如 http://hostname:port
/// </summary>
public static string SiteBaseUrl = "";
#endregion
#endregion
public static string SystemVersion
{
get
{
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;
}
}
private static DateTime? _領據關帳年月UpdateTime = null;
private static string _領據關帳年月 = string.Empty;
public static string
{
get
{
if (string.IsNullOrEmpty(_領據關帳年月) || !_領據關帳年月UpdateTime.HasValue || _領據關帳年月UpdateTime < DateTime.Now.AddMinutes(-10))
{
using (var conn = DAC.NewConnection())
{
var daoBWEX = new DAC_BWEX(conn);
_領據關帳年月 = daoBWEX.Read領據關帳年月;
_領據關帳年月UpdateTime = DateTime.Now;
}
}
return _領據關帳年月;
}
set
{
_領據關帳年月 = value;
_領據關帳年月UpdateTime = DateTime.Now;
using (var conn = DAC.NewConnection())
{
new DAC_BWEX(conn).WriteSetting("領據關帳年月", 1, value);
}
}
}
private static decimal? _領據執行業務所得課稅門檻 = null;
public static decimal
{
get
{
if (!_領據執行業務所得課稅門檻.HasValue)
{
using (var conn = DAC.NewConnection())
{
_領據執行業務所得課稅門檻 = new DAC_BRTE(conn).;
}
}
return _領據執行業務所得課稅門檻.Value;
}
}
private static decimal? _領據薪資課稅門檻 = null;
public static decimal
{
get
{
if (!_領據薪資課稅門檻.HasValue)
{
using (var conn = DAC.NewConnection())
{
_領據薪資課稅門檻 = new DAC_BRTE(conn).;
}
}
return _領據薪資課稅門檻.Value;
}
}
private static decimal? _領據基本工資 = null;
public static decimal
{
get
{
if (!_領據基本工資.HasValue)
{
using (var conn = DAC.NewConnection())
{
_領據基本工資 = new DAC_BRTE(conn).;
}
}
return _領據基本工資.Value;
}
}
private static decimal? _領據執行業務所得稅率 = null;
public static decimal
{
get
{
if (!_領據執行業務所得稅率.HasValue)
{
using (var conn = DAC.NewConnection())
{
_領據執行業務所得稅率 = new DAC_BRTE(conn).;
}
}
return _領據執行業務所得稅率.Value;
}
}
private static decimal? _領據薪資稅率 = null;
public static decimal
{
get
{
if (!_領據薪資稅率.HasValue)
{
using (var conn = DAC.NewConnection())
{
_領據薪資稅率 = new DAC_BRTE(conn).;
}
}
return _領據薪資稅率.Value;
}
}
}
}
+220
View File
@@ -0,0 +1,220 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Text;
using WebLib;
namespace Education
{
/// <summary>
/// 取得權限設定
/// </summary>
public class MWEB: DAC
{
public MWEB()
{
}
/// <summary>
/// 檢查目前登入的員工是否有某程式的權限
/// </summary>
/// <param name="programId">程式編號</param>
/// <param name="rightName">權限名稱</param>
/// <param name="employeeId">員工編號</param>
/// <returns></returns>
public bool CheckRight(string programId, WRightName rightName, string employeeId)
{
if (programId == null)
programId = "NO PROGRAM ID";
if (employeeId == null)
employeeId = "NOBODY";
// 取得員工權限
string right1 = BWCPE_GetRight(programId, employeeId, rightName);
// 取得這個員工隸屬的群組
string[] bpglps = BWEH_GetBpglpListByBpeno(employeeId);
// 取得各群組權限
string[] right2 = new string[bpglps.Length];
for (int i = 0; i < right2.Length; i++)
{
right2[i] = BWCPG_GetRight(programId, bpglps[i], rightName);
}
// 綜合判斷權限
string right = "";
if (right1 != "")
right = right1;
if (right != "Y")
for (int i = 0; i < right2.Length; i++)
{
if (right2[i] != "")
{
if (right != "Y" && right2[i] == "Y")
right = "Y";
else if (right != "Y" && right2[i] == "N")
right = "N";
}
}
return right == "Y";
}
/// <summary>
/// 取員工權限
/// </summary>
/// <param name="rightId">權限編號</param>
/// <param name="employId">員工編號</param>
/// <param name="functionName">功能名稱</param>
/// <returns></returns>
private string BWCPE_GetRight(string rightId, string employId, WRightName functionName)
{
string funcName = "";
switch (functionName)
{
case WRightName.Execute:
funcName = "BPRT1";
break;
case WRightName.Insert:
funcName = "BPRTI";
break;
case WRightName.Update:
funcName = "BPRTM";
break;
case WRightName.Delete:
funcName = "BPRTD";
break;
case WRightName.Search:
funcName = "BPRTF";
break;
case WRightName.Print:
funcName = "BPRTP";
break;
}
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP FROM BWCPE WHERE BPPRG=@BPPRG AND BPENO=@BPENO";
AddParam(cmd, "BPPRG", rightId);
AddParam(cmd, "BPENO", employId);
DataTable data = Select(cmd);
if (data.Rows.Count != 0)
{
return data.Rows[0][funcName].ToString();
}
return "";
}
/// <summary>
/// 取員工所屬群組
/// </summary>
/// <param name="employeeId"></param>
/// <returns></returns>
private string[] BWEH_GetBpglpListByBpeno(string employeeId)
{
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT E.BPGLP AS BPGLP
FROM BWEG E, BWEH G
WHERE E.BPGLP=G.BPGLP AND G.BPENO=@BPENO
ORDER BY E.BPGLP ";
AddParam(cmd, "BPENO", employeeId);
DataTable inGroup = Select(cmd);
if (inGroup.Rows.Count == 0)
return new string[0];
else
{
string[] result = new string[inGroup.Rows.Count];
for (int i = 0; i < inGroup.Rows.Count; i++)
{
result[i] = inGroup.Rows[i][0].ToString();
}
return result;
}
}
/// <summary>
/// 取群組權限
/// </summary>
/// <param name="rightId">權限編號</param>
/// <param name="groupId">群組編號</param>
/// <param name="functionName">功能名稱</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
private string BWCPG_GetRight(string rightId, string groupId, WRightName functionName)
{
string funcName = "";
switch (functionName)
{
case WRightName.Execute:
funcName = "BPRT1";
break;
case WRightName.Insert:
funcName = "BPRTI";
break;
case WRightName.Update:
funcName = "BPRTM";
break;
case WRightName.Delete:
funcName = "BPRTD";
break;
case WRightName.Search:
funcName = "BPRTF";
break;
case WRightName.Print:
funcName = "BPRTP";
break;
}
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP FROM BWCPG WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP";
AddParam(cmd, "BPPRG", rightId);
AddParam(cmd, "BPGLP", groupId);
DataTable data = Select(cmd);
if (data.Rows.Count != 0)
{
return data.Rows[0][funcName].ToString();
}
return "";
}
}
public enum WRightName
{
/// <summary>
/// 主檔
/// </summary>
Execute,
/// <summary>
/// 新增
/// </summary>
Insert,
/// <summary>
/// 更正
/// </summary>
Update,
/// <summary>
/// 刪除
/// </summary>
Delete,
/// <summary>
/// 查詢
/// </summary>
Search,
/// <summary>
/// 印表
/// </summary>
Print
}
public class ProgramID
{
public const string = "TR_EXPORT";
}
}
@@ -0,0 +1,173 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Timers;
using System.IO;
namespace Wellan.Service
{
/// <summary>
/// 檔案定時清除服務
/// </summary>
public class WDeleteFileService
{
private WDeleteFileService()
{
_deleteFilePatterns = new List<string>();
_timer = new Timer();
_timer.Enabled = false;
_timer.Elapsed += new ElapsedEventHandler(DoDeleteFile);
}
public static WDeleteFileService GetInstance()
{
if (_instance == null)
_instance = new WDeleteFileService();
return _instance;
}
/// <summary>
/// 檔案刪除間隔時間,單位為秒。預設值為 600 秒
/// </summary>
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
/// <summary>
/// 要刪除多久之前的檔案,單位為秒。預設值為 600 秒
/// </summary>
public int FileAgeToDelete
{
get
{
return Convert.ToInt32(_fileAge.TotalSeconds);
}
set
{
_fileAge = new TimeSpan(value * TimeSpan.TicksPerSecond);
}
}
/// <summary>
/// 設定或取得檔案定時清除服務是否啟動
/// </summary>
public bool Enabled
{
get
{
return _enabled;
}
set
{
if (value)
{
if (_enabled)
return;
_timer.Interval = _interval * 1000;
_timer.AutoReset = true;
_timer.Enabled = true;
_enabled = true;
}
else
{
if (!_enabled)
return;
_enabled = false;
_timer.Enabled = false;
}
}
}
/// <summary>
/// <para>欲清除的檔案路徑及檔案名稱,檔案名稱可以使用萬用字元</para>
/// <para>需要多個檔案路徑及檔案名稱時,請將所需的檔案路徑及檔案名稱一一加入</para>
/// <para>例如:c:\temp\*.mdb 表示要清除 c:\temp 目錄下的 *.mdb</para>
/// </summary>
public List<string> DeletePatterns
{
get
{
return _deleteFilePatterns;
}
}
/// <summary>
/// 實際執行刪除的動作
/// </summary>
private void DoDeleteFile(object sender, ElapsedEventArgs e)
{
if (!_enabled)
{
_timer.Enabled = false;
return;
}
_timer.Enabled = false;
try
{
foreach (string pattern in _deleteFilePatterns)
{
string namepart = Path.GetFileName(pattern);
string pathPart = pattern.Substring(0, pattern.Length - namepart.Length);
try
{
DirectoryInfo dirInfo = new DirectoryInfo(pathPart);
FileInfo[] matchFiles = dirInfo.GetFiles(namepart);
foreach (FileInfo file in matchFiles)
{
try
{
if (DateTime.Now - file.LastWriteTime > _fileAge)
file.Delete();
}
catch
{
// do nothing
}
}
}
catch
{
// do nothing
}
}
}
finally
{
_timer.Enabled = true;
}
}
private static WDeleteFileService _instance = null;
private List<string> _deleteFilePatterns = null;
private Timer _timer = null;
private int _interval = 600;
private TimeSpan _fileAge = new TimeSpan(TimeSpan.TicksPerSecond * 600);
private bool _enabled = false;
#region UNIT TEST
public static void Main()
{
WDeleteFileService delSrv = WDeleteFileService.GetInstance();
delSrv.DeletePatterns.Add(@"c:\temp\*.*");
delSrv.Interval = 5;
delSrv.FileAgeToDelete = 1;
delSrv.Enabled = true;
Console.WriteLine("Press ENTER to end program");
Console.ReadLine();
delSrv.Enabled = false;
}
#endregion
}
}
@@ -0,0 +1,129 @@
using System;
using System.Data;
using System.Configuration;
using System.Net;
using System.Net.Mail;
using System.Collections.Generic;
using System.Timers;
/// <summary>
/// 郵件傳送服務
/// </summary>
public class WMailSender
{
private static WMailSender _instance = null;
private Queue<MailMessage> _queue = null;
private bool _enabled = false;
private int _interval = 30;
private Timer _timer = null;
private string _host = "";
private WMailSender()
{
_queue = new Queue<MailMessage>();
_timer = new Timer();
_timer.Enabled = false;
_timer.Elapsed += new ElapsedEventHandler(SendMailLoop);
}
public static WMailSender GetInstance()
{
if (_instance == null)
_instance = new WMailSender();
return _instance;
}
public string Host
{
set
{
_host = value;
}
get
{
return _host;
}
}
public void Send(MailMessage message)
{
_queue.Enqueue(message);
}
private void SendMailLoop(object sender, ElapsedEventArgs e)
{
if (!_enabled)
{
_timer.Enabled = false;
return;
}
_timer.Enabled = false;
SmtpClient _client = new SmtpClient();
//_client.DeliveryMethod = SmtpDeliveryMethod.Network;
try
{
while (_queue.Count > 0)
{
MailMessage message = _queue.Dequeue();
try
{
_client.Send(message);
}
catch
{
// 如果傳送失敗,需重傳
_queue.Enqueue(message);
}
}
}
finally
{
_timer.Enabled = true;
}
}
public int Interval
{
get
{
return _interval;
}
set
{
_interval = value;
}
}
public bool Enabled
{
get
{
return _enabled;
}
set
{
if (value)
{
if (_enabled)
return;
_timer.Interval = _interval * 1000;
_timer.AutoReset = true;
_timer.Enabled = true;
_enabled = true;
}
else
{
if (!_enabled)
return;
_enabled = false;
_timer.Enabled = false;
}
}
}
}
@@ -0,0 +1,187 @@
<?xml version="1.0" encoding="utf-8" ?>
<LookupConfig xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd">
<Appearence dataTextColor="#000000"
dataBackgroundColor="#FFFFFF"
dataAltBackgroundColor="#CCCCCC"
titleTextColor="#FFFFFF"
titleBackgroundColor="#2472B2"
titleTextSize="12pt"
dataTextSize="12pt"/>
<Lookup name="BDPT"
sql="SELECT BDNUM,BDNAM FROM BDPT WHERE :WHERE ORDER BY :ORDER"
keyFields="BDNUM,BDMAN"
listFields="BDNUM,BDNAM"
outputFields="BDNUM,BDNAM"
listTitles="部門編號,部門名稱"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPSN"
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE ORDER BY :ORDER"
keyFields="BPENO,BPNME,BPEML"
listFields="BPENO,BPNME,BPEML"
outputFields="BPENO,BPNME,BPEML"
listTitles="員工編號,員工姓名,電子郵件"
listTitleMids=""
listWidths="80,150,200"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPSN1"
sql="SELECT BPENO, BPNME FROM BPSNView WHERE :WHERE AND (BPEDY IS NULL OR BPEDY >= CONVERT(DATETIME, CONVERT(VARCHAR, DATEADD(Month, -1, DATEADD(Day, -DAY(GETDATE()) + 1, GETDATE())), 112), 112)) ORDER BY :ORDER"
keyFields="BPENO,BPNME"
listFields="BPENO,BPNME"
outputFields="BPENO,BPNME"
listTitles="員工編號,員工姓名"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPSN2"
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE AND BPEDY IS NULL AND BPDPT != 'F01' ORDER BY :ORDER"
keyFields="BPENO,BPNME,BPEML"
listFields="BPENO,BPNME,BPEML"
outputFields="BPENO,BPNME,BPEML"
listTitles="員工編號,員工姓名,電子郵件"
listTitleMids=""
listWidths="80,150,200"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPSNEML"
sql="SELECT BPENO, BPNME, BPEML FROM BPSNView WHERE :WHERE AND (BPEDY IS NULL OR BPEDY >= CONVERT(DATETIME, CONVERT(VARCHAR, DATEADD(Month, -1, DATEADD(Day, -DAY(GETDATE()) + 1, GETDATE())), 112), 112)) ORDER BY :ORDER"
keyFields="BPNME,BPEML"
listFields="BPNME,BPEML"
outputFields="BPNME,BPEML"
listTitles="員工姓名,電子郵件"
listTitleMids=""
listWidths="100,180"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BCLS"
sql="SELECT BSCLS,BSSCR FROM BCLS WHERE :WHERE ORDER BY :ORDER"
keyFields="BSCLS,BSSCR"
listFields="BSCLS,BSSCR"
outputFields="BSCLS,BSSCR"
listTitles="類別編號,類別內容"
listTitleMids=""
listWidths="80,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BCLSEDIT"
sql="SELECT '' BSCLS, '' BSSCR UNION SELECT BSCLS,BSSCR FROM BCLS WHERE :WHERE ORDER BY :ORDER"
keyFields="BSCLS,BSSCR"
listFields="BSCLS,BSSCR"
outputFields="BSCLS,BSSCR"
listTitles="類別編號,類別內容"
listTitleMids=""
listWidths="80,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPNO"
sql="SELECT BPPNO,BPNAM FROM BPNO WHERE :WHERE ORDER BY :ORDER"
keyFields="BPPNO,BPNAM"
listFields="BPPNO,BPNAM"
outputFields="BPPNO,BPNAM"
listTitles="專案編號,專案名稱"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BCUS"
sql="SELECT BCNUM,BCNAM FROM BCUS WHERE :WHERE ORDER BY :ORDER"
keyFields="BCNUM,BCNAM"
listFields="BCNUM,BCNAM"
outputFields="BCNUM,BCNAM"
listTitles="客戶編號,客戶名稱"
listTitleMids=""
listWidths="80,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPRJ"
sql="SELECT BPPNM, BPPME FROM BPRJ WHERE :WHERE ORDER BY :ORDER"
keyFields="BPPNM,BPPME"
listFields="BPPNM,BPPME"
outputFields="BPPNM,BPPME"
listTitles="專案編號,專案名稱"
listTitleMids=""
listWidths="80,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPAA"
sql="SELECT BPPYN, BPPYM FROM BPAA WHERE :WHERE ORDER BY :ORDER"
keyFields="BPPYN,BPPYM"
listFields="BPPYN,BPPYM"
outputFields="BPPYN,BPPYM"
listTitles="專案年度編號,專案年度名稱"
listTitleMids=""
listWidths="120,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BRML"
sql="SELECT BCNUM, BCNAM FROM BRML WHERE :WHERE ORDER BY :ORDER"
keyFields="BCNUM,BCNAM"
listFields="BCNUM,BCNAM"
outputFields="BCNUM,BCNAM"
listTitles="銀行代號,銀行名稱"
listTitleMids=""
listWidths="120,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BFRM"
sql="SELECT BFNUM, BFNAM, BFFRM FROM BFRM WHERE :WHERE ORDER BY :ORDER"
keyFields="BFNUM,BFNAM"
listFields="BFNUM,BFNAM"
outputFields="BFNUM,BFNAM,BFFRM"
listTitles="公式代號,公式名稱"
listTitleMids=""
listWidths="120,300"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="BPAP"
sql="SELECT BPENO, BPNME FROM BPAP WHERE :WHERE ORDER BY :ORDER"
keyFields="BPENO,BPNME"
listFields="BPENO,BPNME"
outputFields="BPENO,BPNME"
listTitles="人員編號,人員姓名"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="組織類別"
sql="SELECT 組織類別ID,組織類別名稱 FROM 組織類別 WHERE :WHERE ORDER BY :ORDER"
keyFields="組織類別ID,組織類別名稱"
listFields="組織類別ID,組織類別名稱"
outputFields="組織類別ID,組織類別名稱"
listTitles="組織類別ID,組織類別名稱"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
<Lookup name="職務"
sql="SELECT 職務ID, 職務名稱 FROM 職務 WHERE :WHERE ORDER BY :ORDER"
keyFields="職務ID,職務名稱"
listFields="職務ID,職務名稱"
outputFields="職務ID,職務名稱"
listTitles="職務ID,職務名稱"
listTitleMids=""
listWidths="80,150"
maxRecord="20"
notShowOnlyOneRecord="true"/>
</LookupConfig>
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="LookupConfig" targetNamespace="http://www.maolaoda.com.tw/LookupConfig.xsd"
elementFormDefault="qualified" xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd"
xmlns:mstns="http://www.maolaoda.com.tw/LookupConfig.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<xs:complexType name="Lookup">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="sql" type="xs:string" use="required"/>
<xs:attribute name="keyFields" type="xs:string" use="required"/>
<xs:attribute name="listFields" type="xs:string" use="required"/>
<xs:attribute name="outputFields" type="xs:string" use="required"/>
<xs:attribute name="listTitles" type="xs:string" use="required"/>
<xs:attribute name="listTitleMids" type="xs:string" use="optional"/>
<xs:attribute name="listWidths" type="xs:string" use="optional"/>
<xs:attribute name="maxRecord" type="xs:int" use="required"/>
<xs:attribute name="notShowOnlyOneRecord" type="xs:boolean" use="optional"/>
</xs:complexType>
<xs:complexType name="Appearence">
<xs:attribute name="titleBackgroundColor" type="xs:string"/>
<xs:attribute name="dataBackgroundColor" type="xs:string"/>
<xs:attribute name="dataTextColor" type="xs:string"/>
<xs:attribute name="dataAltBackgroundColor" type="xs:string"/>
<xs:attribute name="titleTextColor" type="xs:string"/>
<xs:attribute name="titleTextSize" type="xs:string"/>
<xs:attribute name="dataTextSize" type="xs:string"/>
</xs:complexType>
<xs:element name="LookupConfig">
<xs:complexType>
<xs:sequence>
<xs:element name="Appearence" maxOccurs="1" minOccurs="0" type="Appearence"/>
<xs:element name="Lookup" type="Lookup" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!--This file is auto-generated by the XML Schema Designer. It holds layout information for components on the designer surface.-->
<XSDDesignerLayout Style="TopDown" layoutVersion="2" viewPortLeft="-659" viewPortTop="0" zoom="100">
<Lookup_XmlComplexType left="0" top="715" width="10054" height="6614" selected="0" zOrder="1" index="0" expanded="1" />
<LookupConfig_XmlElement left="13785" top="848" width="7196" height="3280" selected="0" zOrder="2" index="1" expanded="1">
<Appearence_XmlElement left="11774" top="4636" width="5292" height="3281" selected="0" zOrder="4" index="0" expanded="0" />
<Lookup_XmlElement left="17700" top="4636" width="5292" height="3281" selected="0" zOrder="7" index="1" expanded="0" />
</LookupConfig_XmlElement>
<Appearence_XmlComplexType left="-26" top="8203" width="8890" height="6138" selected="0" zOrder="10" index="2" expanded="1" />
</XSDDesignerLayout>
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="LookupConfig" targetNamespace="http://www.maolaoda.com.tw/LookupConfig.xsd"
elementFormDefault="qualified" xmlns="http://www.maolaoda.com.tw/LookupConfig.xsd"
xmlns:mstns="http://www.maolaoda.com.tw/LookupConfig.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msprop="urn:schemas-microsoft-com:xml-msprop">
<xs:complexType name="Lookup">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="sql" type="xs:string" use="required"/>
<xs:attribute name="keyFields" type="xs:string" use="required"/>
<xs:attribute name="listFields" type="xs:string" use="required"/>
<xs:attribute name="outputFields" type="xs:string" use="required"/>
<xs:attribute name="listTitles" type="xs:string" use="required"/>
<xs:attribute name="listTitleMids" type="xs:string" use="required"/>
<xs:attribute name="listWidths" type="xs:string" use="required"/>
<xs:attribute name="maxRecord" type="xs:int" use="required"/>
<xs:attribute name="notShowOnlyOneRecord" type="xs:boolean" use="optional"/>
</xs:complexType>
<xs:complexType name="Appearence">
<xs:attribute name="titleBackgroundColor" type="xs:string"/>
<xs:attribute name="dataBackgroundColor" type="xs:string"/>
<xs:attribute name="dataTextColor" type="xs:string"/>
<xs:attribute name="dataAltBackgroundColor" type="xs:string"/>
<xs:attribute name="titleTextColor" type="xs:string"/>
<xs:attribute name="titleTextSize" type="xs:string"/>
<xs:attribute name="dataTextSize" type="xs:string"/>
</xs:complexType>
<xs:element name="LookupConfig">
<xs:complexType>
<xs:sequence>
<xs:element name="Appearence" maxOccurs="1" minOccurs="0" type="Appearence"/>
<xs:element name="Lookup" type="Lookup" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WebLib;
namespace Education
{
public class DAC_檔案圖示: NameValueList
{
public DAC_檔案圖示()
{
Add("doc.png", "doc");
Add("doc.png", "docx");
Add("xls.png", "xls");
Add("xls.png", "xlsx");
Add("txt.png", "txt");
Add("exe.png", "exe");
Add("gif.png", "gif");
Add("html.png", "htm");
Add("html.png", "html");
Add("jpg.png", "jpg");
Add("jpg.png", "jpeg");
Add("pdf.png", "pdf");
Add("png.png", "png");
Add("ppt.png", "ppt");
Add("rar.png", "rar");
Add("rtf.png", "rtf");
Add("swf.png", "swf");
Add("zip.png", "zip");
}
}
}
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Common;
using WebLib;
namespace Education
{
public class DAC_GetData : DAC
{
public DAC_GetData()
: base()
{ }
public DAC_GetData(DbConnection conn)
: base(conn)
{ }
public (int id)
{
DAC_場地 Dao場地 = new DAC_場地(conn);
DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(conn);
int = Dao訓練課程企劃.Select選定場地(id);
if ( > 0)
{
List d = Dao場地.SelectOne();
if (d.Count > 0)
return d[0];
}
else
{
string = Dao訓練課程企劃.Select選定場地名稱(id);
if (!string.IsNullOrEmpty())
{
result = new ();
result. = ;
return result;
}
}
return new ();
}
public (int id, int )
{
DAC_講師 Dao講師 = new DAC_講師(conn);
DAC_訓練課程企劃 Dao訓練課程企劃 = new DAC_訓練課程企劃(conn);
int = Dao訓練課程企劃.Select選定講師(id, );
if ( > 0)
{
List d = Dao講師.SelectOne();
if (d.Count > 0)
return d[0];
}
else
{
string = Dao訓練課程企劃.Select選定講師名稱(id, );
if (!string.IsNullOrEmpty())
{
result = new ();
result. = ;
return result;
}
}
return new ();
}
public (object id, object )
{
return (DAC.GetInt32(id), DAC.GetInt32());
}
public string (string id)
{
return new DAC_BCLS().Get類別名稱(DAC_檢附資料參考.BSPAR, id).Replace("\r\n", "<br/>").Replace("\r", "<br/>").Replace("\n", "<br/>");
}
}
}
@@ -0,0 +1,235 @@
using System;
using System.Collections.Generic;
using System.Text;
using Wellan.Common;
using System.Data;
using System.Data.Common;
namespace Education
{
/// <summary>
/// 員工權限
/// </summary>
public class BWCPE_DAC : DAC
{
private DbCommand cmdSelect = null;
private DbCommand cmdSelectRight = null;
private DbCommand cmdCheckExist = null;
private DbCommand cmdInsert = null;
private DbCommand cmdUpdate = null;
public BWCPE_DAC()
{
}
public BWCPE_DAC(string connectionConfig, string connectionConfigName)
: base(connectionConfig, connectionConfigName)
{
}
private void PrepareSql()
{
EnsureQuery();
string tblBwcpe = WGuard1.WCFA("BWCPE");
if (cmdSelect == null)
{
cmdSelect = Query.NewCommand(Query.ReplaceParamNamePrefix(
"SELECT B.BPPRG AS BPPRG, B.BPENO AS BPENO, A.BPENO AS BBPENO, A.BPNME AS BBPNME, "
+ " B.BPRT1 AS BPRT1, B.BPRTI AS BPRTI, B.BPRTM AS BPRTM, B.BPRTD AS BPRTD, "
+ " B.BPRTF AS BPRTF, B.BPRTP AS BPRTP, B.TRDAT AS TRDAT, B.TRMOD AS TRMOD, "
+ " B.TRUSR AS TRUSR "
+ " FROM " + WGuard1.WCFA("BPSN") + " A "
+ " LEFT OUTER JOIN " + tblBwcpe + " B ON A.BPENO=B.BPENO AND B.BPPRG=@BPPRG "
+ " WHERE A.BPEDY IS NULL AND A.BPENO <> '  ' "
+ " ORDER BY A.BPENO "));
cmdSelect.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
}
if (cmdCheckExist == null)
{
cmdCheckExist = Query.NewCommand(Query.ReplaceParamNamePrefix("SELECT COUNT(1) FROM " + tblBwcpe + " WHERE BPPRG=@BPPRG AND BPENO=@BPENO"));
cmdCheckExist.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdCheckExist.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
}
if (cmdInsert == null)
{
cmdInsert = Query.NewCommand(Query.ReplaceParamNamePrefix(
"INSERT INTO " + tblBwcpe + " (BPPRG, BPENO, BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP, TRDAT, TRMOD, TRUSR) "
+ " VALUES (@BPPRG, @BPENO, @BPRT1, @BPRTI, @BPRTM, @BPRTD, @BPRTF, @BPRTP, @TRDAT, 'INSERT', @TRUSR)"));
cmdInsert.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
cmdInsert.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
}
if (cmdUpdate == null)
{
cmdUpdate = Query.NewCommand(Query.ReplaceParamNamePrefix(
"UPDATE " + tblBwcpe
+ " SET BPRT1=@BPRT1, BPRTI=@BPRTI, BPRTM=@BPRTM, BPRTD=@BPRTD, BPRTF=@BPRTF,"
+ " BPRTP=@BPRTP, TRDAT=@TRDAT, TRMOD='UPDATE', TRUSR=@TRUSR"
+ " WHERE BPPRG=@BPPRG AND BPENO=@BPENO"));
cmdUpdate.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
cmdUpdate.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
}
if (cmdSelectRight == null)
{
cmdSelectRight = Query.NewCommand(Query.ReplaceParamNamePrefix(
"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP "
+ " FROM " + tblBwcpe + " WHERE BPPRG=@BPPRG AND BPENO=@BPENO "));
cmdSelectRight.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdSelectRight.Parameters.Add(Query.NewParameter("BPENO", DbType.AnsiString));
}
}
public DataTable Select(string bpprg)
{
PrepareSql();
cmdSelect.Parameters["BPPRG"].Value = bpprg;
return Query.Select(cmdSelect);
}
public bool CheckExist(string bpprg, string bpeno)
{
PrepareSql();
cmdCheckExist.Parameters["BPPRG"].Value = bpprg;
cmdCheckExist.Parameters["BPENO"].Value = bpeno;
int i = Convert.ToInt16(Query.ExecuteScalar(cmdCheckExist));
return !(i == 0);
}
public void Insert(string bpprg, string bpeno, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
PrepareSql();
FillParameters(cmdInsert, bpprg, bpeno, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
Query.ExecuteNonQuery(cmdInsert);
}
public void Update(string bpprg, string bpeno, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
PrepareSql();
FillParameters(cmdUpdate, bpprg, bpeno, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
Query.ExecuteNonQuery(cmdUpdate);
}
public void SetAllRight(string bpprg, string bpeno, bool right)
{
string r = right ? "Y" : "N";
if (!CheckExist(bpprg, bpeno))
{
Insert(bpprg, bpeno, r, r, r, r, r, r);
}
else
{
Update(bpprg, bpeno, r, r, r, r, r, r);
}
}
private void FillParameters(DbCommand cmd, string bpprg, string bpeno, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
cmd.Parameters["BPPRG"].Value = bpprg;
cmd.Parameters["BPENO"].Value = bpeno;
cmd.Parameters["BPRT1"].Value = bprt1 == "Y" || bprt1 == "N" ? bprt1 : "N";
cmd.Parameters["BPRTI"].Value = bprti == "Y" || bprti == "N" ? bprti : "N";
cmd.Parameters["BPRTM"].Value = bprtm == "Y" || bprtm == "N" ? bprtm : "N";
cmd.Parameters["BPRTD"].Value = bprtd == "Y" || bprtd == "N" ? bprtd : "N";
cmd.Parameters["BPRTF"].Value = bprtf == "Y" || bprtf == "N" ? bprtf : "N";
cmd.Parameters["BPRTP"].Value = bprtp == "Y" || bprtp == "N" ? bprtp : "N";
cmd.Parameters["TRDAT"].Value = DateTime.UtcNow.AddHours(8);
cmd.Parameters["TRUSR"].Value = WGuard1.CUSR;
}
/// <summary>
/// 取得員工權限<para></para>
/// "Y" 表示有權限 "N" 表示無權限 "" 表示未設定
/// </summary>
/// <param name="bpprg">程式名稱</param>
/// <param name="bpeno">員工編號</param>
/// <param name="right">權限</param>
/// <returns>"Y" 表示有權限 "N" 表示無權限 "" 表示未設定</returns>
public string GetRight(string bpprg, string bpeno, WRightName right)
{
PrepareSql();
string funcName = "";
switch (right)
{
case WRightName.Execute:
funcName = "BPRT1";
break;
case WRightName.Insert:
funcName = "BPRTI";
break;
case WRightName.Update:
funcName = "BPRTM";
break;
case WRightName.Delete:
funcName = "BPRTD";
break;
case WRightName.Search:
funcName = "BPRTF";
break;
case WRightName.Print:
funcName = "BPRTP";
break;
}
cmdSelectRight.Parameters["BPPRG"].Value = bpprg;
cmdSelectRight.Parameters["BPENO"].Value = bpeno;
DataTable data = Query.Select(cmdSelectRight);
if (data.Rows.Count != 0)
{
return data.Rows[0][funcName].ToString();
}
return "";
}
}
public enum WRightName
{
/// <summary>
/// 主檔
/// </summary>
Execute,
/// <summary>
/// 新增
/// </summary>
Insert,
/// <summary>
/// 更正
/// </summary>
Update,
/// <summary>
/// 刪除
/// </summary>
Delete,
/// <summary>
/// 查詢
/// </summary>
Search,
/// <summary>
/// 印表
/// </summary>
Print
}
}
@@ -0,0 +1,206 @@
using System;
using System.Collections.Generic;
using System.Text;
using Wellan.Common;
using System.Data;
using System.Data.Common;
namespace Education
{
/// <summary>
/// 群組權限
/// </summary>
public class BWCPG_DAC : DAC
{
private DbCommand cmdSelect = null;
private DbCommand cmdSelectRight = null;
private DbCommand cmdCheckExist = null;
private DbCommand cmdInsert = null;
private DbCommand cmdUpdate = null;
public BWCPG_DAC()
{
}
public BWCPG_DAC(string connectionConfig, string connectionConfigName)
: base(connectionConfig, connectionConfigName)
{
}
private void PrepareSql()
{
EnsureQuery();
string tblBwcpg = WGuard1.WCFA("BWCPG");
if (cmdSelect == null)
{
cmdSelect = Query.NewCommand(Query.ReplaceParamNamePrefix(
"SELECT B.BPPRG AS BPPRG, B.BPGLP AS BPGLP, A.BPGLP AS BBPGLP, A.BPDSP AS BBPDSP, "
+ " B.BPRT1 AS BPRT1, B.BPRTI AS BPRTI, B.BPRTM AS BPRTM, B.BPRTD AS BPRTD, "
+ " B.BPRTF AS BPRTF, B.BPRTP AS BPRTP, B.TRDAT AS TRDAT, B.TRMOD AS TRMOD, "
+ " B.TRUSR AS TRUSR "
+ " FROM " + WGuard1.WCFA("BWEG") + " A "
+ " LEFT OUTER JOIN " + tblBwcpg + " B ON A.BPGLP=B.BPGLP AND B.BPPRG=@BPPRG "
+ " ORDER BY A.BPGLP "));
cmdSelect.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
}
if (cmdCheckExist == null)
{
cmdCheckExist = Query.NewCommand(Query.ReplaceParamNamePrefix("SELECT COUNT(1) FROM " + tblBwcpg + " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP"));
cmdCheckExist.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdCheckExist.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
}
if (cmdInsert == null)
{
cmdInsert = Query.NewCommand(Query.ReplaceParamNamePrefix(
"INSERT INTO " + tblBwcpg + " (BPPRG, BPGLP, BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP, TRDAT, TRMOD, TRUSR) "
+ " VALUES (@BPPRG, @BPGLP, @BPRT1, @BPRTI, @BPRTM, @BPRTD, @BPRTF, @BPRTP, @TRDAT, 'INSERT', @TRUSR)"));
cmdInsert.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
cmdInsert.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
cmdInsert.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
}
if (cmdUpdate == null)
{
cmdUpdate = Query.NewCommand(Query.ReplaceParamNamePrefix(
"UPDATE " + tblBwcpg
+ " SET BPRT1=@BPRT1, BPRTI=@BPRTI, BPRTM=@BPRTM, BPRTD=@BPRTD, BPRTF=@BPRTF,"
+ " BPRTP=@BPRTP, TRDAT=@TRDAT, TRMOD='UPDATE', TRUSR=@TRUSR"
+ " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP"));
cmdUpdate.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRT1", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTI", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTM", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTD", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTF", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("BPRTP", DbType.AnsiString));
cmdUpdate.Parameters.Add(Query.NewParameter("TRDAT", DbType.DateTime));
cmdUpdate.Parameters.Add(Query.NewParameter("TRUSR", DbType.AnsiString));
}
if (cmdSelectRight == null)
{
cmdSelectRight = Query.NewCommand(Query.ReplaceParamNamePrefix(
"SELECT BPRT1, BPRTI, BPRTM, BPRTD, BPRTF, BPRTP "
+ " FROM " + tblBwcpg + " WHERE BPPRG=@BPPRG AND BPGLP=@BPGLP "));
cmdSelectRight.Parameters.Add(Query.NewParameter("BPPRG", DbType.AnsiString));
cmdSelectRight.Parameters.Add(Query.NewParameter("BPGLP", DbType.AnsiString));
}
}
public DataTable Select(string bpprg)
{
PrepareSql();
cmdSelect.Parameters["BPPRG"].Value = bpprg;
return Query.Select(cmdSelect);
}
public bool CheckExist(string bpprg, string bpglp)
{
PrepareSql();
cmdCheckExist.Parameters["BPPRG"].Value = bpprg;
cmdCheckExist.Parameters["BPGLP"].Value = bpglp;
int i = Convert.ToInt16(Query.ExecuteScalar(cmdCheckExist));
return i != 0;
}
public void Insert(string bpprg, string bpglp, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
PrepareSql();
FillParameters(cmdInsert, bpprg, bpglp, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
Query.ExecuteNonQuery(cmdInsert);
}
public void Update(string bpprg, string bpglp, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
PrepareSql();
FillParameters(cmdUpdate, bpprg, bpglp, bprt1, bprti, bprtm, bprtd, bprtf, bprtp);
Query.ExecuteNonQuery(cmdUpdate);
}
public void SetAllRight(string bpprg, string bpglp, bool right)
{
string r = right ? "Y" : "N";
if (!CheckExist(bpprg, bpglp))
{
Insert(bpprg, bpglp, r, r, r, r, r, r);
}
else
{
Update(bpprg, bpglp, r, r, r, r, r, r);
}
}
private void FillParameters(DbCommand cmd, string bpprg, string bpglp, string bprt1, string bprti,
string bprtm, string bprtd, string bprtf, string bprtp)
{
cmd.Parameters["BPPRG"].Value = bpprg;
cmd.Parameters["BPGLP"].Value = bpglp;
cmd.Parameters["BPRT1"].Value = bprt1 == "Y" || bprt1 == "N" ? bprt1 : "N";
cmd.Parameters["BPRTI"].Value = bprti == "Y" || bprti == "N" ? bprti : "N";
cmd.Parameters["BPRTM"].Value = bprtm == "Y" || bprtm == "N" ? bprtm : "N";
cmd.Parameters["BPRTD"].Value = bprtd == "Y" || bprtd == "N" ? bprtd : "N";
cmd.Parameters["BPRTF"].Value = bprtf == "Y" || bprtf == "N" ? bprtf : "N";
cmd.Parameters["BPRTP"].Value = bprtp == "Y" || bprtp == "N" ? bprtp : "N";
cmd.Parameters["TRDAT"].Value = DateTime.UtcNow.AddHours(8);
cmd.Parameters["TRUSR"].Value = WGuard1.CUSR;
}
/// <summary>
/// 取得群組權限<para></para>
/// "Y" 表示有權限 "N" 表示無權限 "" 表示未設定
/// </summary>
/// <param name="bpprg">程式名稱</param>
/// <param name="bpglp">群組編號</param>
/// <param name="right">權限</param>
/// <returns>"Y" 表示有權限 "N" 表示無權限 "" 表示未設定</returns>
public string GetRight(string bpprg, string bpglp, WRightName right)
{
PrepareSql();
string funcName = "";
switch (right)
{
case WRightName.Execute:
funcName = "BPRT1";
break;
case WRightName.Insert:
funcName = "BPRTI";
break;
case WRightName.Update:
funcName = "BPRTM";
break;
case WRightName.Delete:
funcName = "BPRTD";
break;
case WRightName.Search:
funcName = "BPRTF";
break;
case WRightName.Print:
funcName = "BPRTP";
break;
}
cmdSelectRight.Parameters["BPPRG"].Value = bpprg;
cmdSelectRight.Parameters["BPGLP"].Value = bpglp;
DataTable data = Query.Select(cmdSelectRight);
if (data.Rows.Count != 0)
{
return data.Rows[0][funcName].ToString();
}
return "";
}
}
}
@@ -0,0 +1,215 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using Wellan.Common;
namespace Education
{
/// <summary>
/// 員工群組
/// </summary>
public class BWEH_DAC : DAC
{
DbCommand cmdInsert = null;
DbCommand cmdDelete = null;
public BWEH_DAC()
{
}
public BWEH_DAC(string connectionConfig, string connectionConfigName)
: base(connectionConfig, connectionConfigName)
{
}
private void PrepareSql()
{
EnsureQuery();
if (cmdInsert == null)
{
cmdInsert = Query.NewCommand("INSERT INTO " + WGuard1.WCFA("BWEH") + " (BPGLP, BPENO) VALUES (@BPGLP, @BPENO)");
cmdInsert.Parameters.Add(Query.NewParameter("BPGLP", DbType.String));
cmdInsert.Parameters.Add(Query.NewParameter("BPENO", DbType.String));
}
if (cmdDelete == null)
{
cmdDelete = Query.NewCommand("DELETE FROM " + WGuard1.WCFA("BWEH") + " WHERE BPGLP=@BPGLP AND BPENO=@BPENO");
cmdDelete.Parameters.Add(Query.NewParameter("BPGLP", DbType.String));
cmdDelete.Parameters.Add(Query.NewParameter("BPENO", DbType.String));
}
}
public void SelectByBpglp(string bpglp, out DataTable inGroup, out DataTable outGroup)
{
PrepareSql();
inGroup = Query.Select(
"SELECT E.BPENO AS BPENO, E.BPNME AS BPNME "
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp +"' "
+ " AND E.BPEDY IS NULL "
+ " ORDER BY E.BPENO ");
outGroup = Query.Select(
"SELECT BPENO, BPNME FROM " + WGuard1.WCFA("BPSN")
+ " WHERE BPENO<>'  ' "
+ " AND BPEDY IS NULL "
+ " AND BPENO NOT IN (SELECT E.BPENO AS BPENO "
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp + "' "
+ " AND E.BPEDY IS NULL ) "
+ " ORDER BY BPENO");
}
public string[] GetBpenoListByBpglp(string bpglp)
{
PrepareSql();
DataTable inGroup = Query.Select(
"SELECT E.BPENO AS BPENO "
+ " FROM " + WGuard1.WCFA("BPSN") + " E," + WGuard1.WCFA("BWEH") + " G"
+ " WHERE G.BPENO=E.BPENO AND G.BPGLP='" + bpglp + "' "
+ " AND E.BPEDY IS NULL "
+ " ORDER BY E.BPENO ");
if (inGroup.Rows.Count == 0)
return new string[0];
else
{
string[] result = new string[inGroup.Rows.Count];
for (int i = 0; i < inGroup.Rows.Count; i++)
{
result[i] = inGroup.Rows[i][0].ToString();
}
return result;
}
}
public void UpdateByBpglp(string bpglp, DataTable updateTable)
{
PrepareSql();
DbConnection conn = Query.NewConnection();
cmdDelete.Connection = conn;
cmdInsert.Connection = conn;
conn.Open();
DbTransaction tran = conn.BeginTransaction();
cmdDelete.Transaction = tran;
cmdInsert.Transaction = tran;
try
{
foreach (DataRow row in updateTable.Rows)
{
if (row.RowState == DataRowState.Added)
{
cmdInsert.Parameters["BPGLP"].Value = bpglp;
cmdInsert.Parameters["BPENO"].Value = row["BPENO", DataRowVersion.Current];
cmdInsert.ExecuteNonQuery();
}
if (row.RowState == DataRowState.Deleted)
{
cmdDelete.Parameters["BPGLP"].Value = bpglp;
cmdDelete.Parameters["BPENO"].Value = row["BPENO", DataRowVersion.Original];
cmdDelete.ExecuteNonQuery();
}
}
tran.Commit();
updateTable.AcceptChanges();
}
catch
{
tran.Rollback();
}
finally
{
conn.Close();
cmdInsert.Dispose();
cmdDelete.Dispose();
}
}
public void SelectByBpeno(string bpeno, out DataTable inGroup, out DataTable outGroup)
{
PrepareSql();
inGroup = Query.Select(
"SELECT E.BPGLP AS BPGLP, E.BPDSP AS BPDSP "
+ " FROM " + WGuard1.WCFA("BWEG") + " E," + WGuard1.WCFA("BWEH") + " G"
+ " WHERE E.BPGLP=G.BPGLP AND G.BPENO='" + bpeno + "' "
+ " ORDER BY E.BPGLP ");
outGroup = Query.Select(
"SELECT BPGLP, BPDSP FROM " + WGuard1.WCFA("BWEG")
+ " WHERE BPGLP NOT IN (SELECT BPGLP FROM " + WGuard1.WCFA("BWEH") + " WHERE BPENO='" + bpeno + "')"
+ " ORDER BY BPGLP");
}
public string[] GetBpglpListByBpeno(string bpeno)
{
PrepareSql();
DataTable inGroup = Query.Select(
"SELECT E.BPGLP AS BPGLP "
+ " FROM " + WGuard1.WCFA("BWEG") + " E," + WGuard1.WCFA("BWEH") + " G"
+ " WHERE E.BPGLP=G.BPGLP AND G.BPENO='" + bpeno + "' "
+ " ORDER BY E.BPGLP ");
if (inGroup.Rows.Count == 0)
return new string[0];
else
{
string[] result = new string[inGroup.Rows.Count];
for (int i = 0; i < inGroup.Rows.Count; i++)
{
result[i] = inGroup.Rows[i][0].ToString();
}
return result;
}
}
public void UpdateByBpeno(string bpeno, DataTable updateTable)
{
PrepareSql();
DbConnection conn = Query.NewConnection();
cmdDelete.Connection = conn;
cmdInsert.Connection = conn;
conn.Open();
DbTransaction tran = conn.BeginTransaction();
cmdDelete.Transaction = tran;
cmdInsert.Transaction = tran;
try
{
foreach (DataRow row in updateTable.Rows)
{
if (row.RowState == DataRowState.Added)
{
cmdInsert.Parameters["BPENO"].Value = bpeno;
cmdInsert.Parameters["BPGLP"].Value = row["BPGLP", DataRowVersion.Current];
cmdInsert.ExecuteNonQuery();
}
if (row.RowState == DataRowState.Deleted)
{
cmdDelete.Parameters["BPENO"].Value = bpeno;
cmdDelete.Parameters["BPGLP"].Value = row["BPGLP", DataRowVersion.Original];
cmdDelete.ExecuteNonQuery();
}
}
tran.Commit();
updateTable.AcceptChanges();
}
catch
{
tran.Rollback();
}
finally
{
conn.Close();
cmdDelete.Dispose();
cmdInsert.Dispose();
}
}
}
}
@@ -0,0 +1,139 @@
using System;
using System.Collections.Generic;
using System.Web;
using System.Data;
using System.Data.Common;
using System.ComponentModel;
using WebLib;
namespace Education
{
[DataObject]
public class DAC_BCLS : DAC
{
public DAC_BCLS()
{ }
public DAC_BCLS(DbConnection conn)
: base(conn)
{ }
[DataObjectMethod(DataObjectMethodType.Select)]
public NameValueList Get類別資料By大類ForList(string )
{
NameValueList result = new NameValueList();
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BSCLS, BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND (BLOCK='' OR BLOCK IS NULL)";
AddParam(cmd, "BSPAR", );
bool wantClose;
IDataReader reader = ExecuteReader(cmd, out wantClose);
try
{
result.Fill(reader, 1, 0);
cmd.Cancel();
reader.Close();
}
finally
{
cmd.Dispose();
reader.Dispose();
CloseConnection(wantClose);
}
return result;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public NameValueList Get類別資料By大類ForDropDown(string )
{
NameValueList result = new NameValueList();
result.Add("(請選擇)", DBNull.Value);
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BSCLS, BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND (BLOCK='' OR BLOCK IS NULL)";
AddParam(cmd, "BSPAR", );
bool wantClose;
IDataReader reader = ExecuteReader(cmd, out wantClose);
try
{
result.Fill(reader, 1, 0, false);
cmd.Cancel();
reader.Close();
}
finally
{
cmd.Dispose();
reader.Dispose();
CloseConnection(wantClose);
}
return result;
}
public string Get類別名稱(object , object )
{
if ( == null)
= DBNull.Value;
if ( == null)
= DBNull.Value;
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BSSCR FROM BCLS WHERE BSPAR=@BSPAR AND BSCLS=@BSCLS";
AddParam(cmd, "BSPAR", );
AddParam(cmd, "BSCLS", );
string result;
ExecuteScalar(cmd, out result);
return result;
}
public void UpdateOne(object , object , object )
{
if ( == null)
= DBNull.Value;
if ( == null)
= DBNull.Value;
if ( == null)
= DBNull.Value;
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT COUNT(1) FROM BCLS WHERE BSPAR=@BSPAR AND BSCLS=@BSCLS";
AddParam(cmd, "BSPAR", );
AddParam(cmd, "BSCLS", );
int count;
ExecuteScalar(cmd, out count);
if (count == 0)
{
cmd.CommandText =
@"INSERT INTO BCLS (BSPAR, BSCLS, BSSCR, BLOCK, TRDAT, TRMOD, TRUSR, BSRMK, DB_APPNO)
VALUES (@BSPAR, @BSCLS, @BSSCR, '', GETDATE(), 'INSERT', @TRUSR, '', 1)";
AddParam(cmd, "BSPAR", );
AddParam(cmd, "BSCLS", );
AddParam(cmd, "BSSCR", );
AddParam(cmd, "TRUSR", CurrentUserId);
ExecuteNonQuery(cmd);
}
else
{
cmd.CommandText =
@"UPDATE BCLS
SET BSSCR = @BSSCR ,
TRDAT = GETDATE() ,
TRMOD = 'UPDATE' ,
TRUSR = @TRUSR ,
DB_APPNO = DB_APPNO + 1
WHERE BSPAR = @BSPAR
AND BSCLS = @BSCLS";
AddParam(cmd, "BSPAR", );
AddParam(cmd, "BSCLS", );
AddParam(cmd, "BSSCR", );
AddParam(cmd, "TRUSR", CurrentUserId);
ExecuteNonQuery(cmd);
}
}
}
}
@@ -0,0 +1,129 @@
using System;
using System.Collections.Generic;
using System.Web;
using System.Data;
using System.Data.Common;
using System.ComponentModel;
using WebLib;
namespace Education
{
[DataObject]
public class DAC_BPAA: DAC
{
/// <summary>
/// 取得指定年度專案計畫代號與名稱,不含總公司
/// </summary>
/// <param name="year">指定年度</param>
/// <returns></returns>
public DataTable GetBpaa(int year)
{
DbCommand cmd = NewCommand();
cmd.CommandText =
@"SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPYER=@BPYER) AND (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001')
ORDER BY BPPYN";
AddParam(cmd, "BPYER", year - PublicVariable.CY11);
return Select(cmd);
}
/// <summary>
/// 取得所有年度專案計畫代號與名稱,含總公司
/// </summary>
/// <returns></returns>
public DataTable GetBpaaWithTY()
{
DbCommand cmd = NewCommand();
cmd.CommandText =
@"SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
ORDER BY BPPYN";
return Select(cmd);
}
/// <summary>
/// 取得所有年度專案計畫代號與名稱,含總公司,並加上一個空項目
/// </summary>
/// <returns></returns>
public DataTable GetBpaaWithTYPlusNone()
{
DbCommand cmd = NewCommand();
cmd.CommandText =
@"SELECT '' BPPYN, '【全部】' BPPYM
UNION
SELECT '000000001' BPPYN, '' BPPYM
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001')
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPCSD IS NULL) AND (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
ORDER BY BPPYN";
return Select(cmd);
}
/// <summary>
/// 取得指定年度專案計畫代號與名稱,含總公司
/// </summary>
/// <param name="year">指定年度</param>
/// <param name="companyID">公司別</param>
/// <returns></returns>
public DataTable GetBpaaWithTY(int year, string companyID)
{
DbCommand cmd = NewCommand();
cmd.CommandText =
@"SELECT '000000001' AS BPPYN, '【非專案人員】' AS BPPYM
UNION
SELECT BPPYN, BPPYM FROM
(
SELECT BPPYN,
ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM AS BPPYM,
(SELECT TOP 1 BPCPY FROM BPRJ WHERE BPRJ.BPPNM=BPAA.BPPNM) AS BPCPY
FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
UNION
SELECT BPPYN,
ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM AS BPPYM,
(SELECT TOP 1 BPCPY FROM BPRJ WHERE BPRJ.BPPNM=BPAA.BPPNM) AS BPCPY
FROM BPAA WHERE (BPPYN = '103JYB00001') OR (BPPYN = '103TYB00001')
) AS TMP1 WHERE BPCPY=@BPCPY
ORDER BY BPPYN";
// @"SELECT '000000001' BPPYN, '【非專案人員】' BPPYM
// UNION
// SELECT BPPYN, '【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】' + BPPYM BPPYM
// FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001')
// ORDER BY BPPYN";
AddParam(cmd, "BPYER", year);
AddParam(cmd, "BPCPY", companyID);
return Select(cmd);
}
/// <summary>
/// 取得指定年度專案計畫代號與名稱,含總公司,並加上一個空項目
/// </summary>
/// <param name="year">指定年度</param>
/// <returns></returns>
public DataTable GetBpaaWithTYPlusNone(int year)
{
DbCommand cmd = NewCommand();
cmd.CommandText =
@"SELECT '' BPPYN, '【全部】' BPPYM
UNION
SELECT '000000001' BPPYN, '' BPPYM
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPYER=@BPYER) AND (BPPYN <> '000000001') AND (BPPYN <> '103JYB00001') AND (BPPYN <> '103TYB00001') AND (BPPYN <> '102JYB00001') AND (BPPYN <> '102TYB00001')
UNION
SELECT BPPYN, ISNULL('【' + (SELECT TOP 1 BSSCR FROM BCLS WHERE BSPAR='BCUSZON' AND BSCLS=SUBSTRING(BPPYN,LEN(BPPYN)-5,1)) + '】', '') + BPPYM BPPYM
FROM BPAA WHERE (BPPYN = '103JYB00001' OR BPPYN = '103TYB00001')
ORDER BY BPPYN";
AddParam(cmd, "BPYER", year - PublicVariable.CY11);
return Select(cmd);
}
}
}
@@ -0,0 +1,124 @@
using System;
using System.Collections.Generic;
using System.Web;
using System.Data;
using System.Data.Common;
using System.ComponentModel;
using WebLib;
namespace Education
{
[DataObject]
public class DAC_BPSN : DAC
{
public DAC_BPSN()
{ }
public DAC_BPSN(DbConnection conn)
: base(conn)
{ }
public string Get員工姓名(object BPENO)
{
if (BPENO == null)
BPENO = DBNull.Value;
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BPNME FROM BPSNView WHERE BPENO=@BPENO";
AddParam(cmd, "BPENO", BPENO);
string result;
ExecuteScalar(cmd, out result);
return result;
}
public string Get電子郵件(object BPENO)
{
if (BPENO == null)
BPENO = DBNull.Value;
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BPEML FROM BPSNView WHERE BPENO=@BPENO";
AddParam(cmd, "BPENO", BPENO);
string result;
ExecuteScalar(cmd, out result);
return result;
}
public string Get公司電話(object BPENO)
{
if (BPENO == null)
BPENO = DBNull.Value;
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT BPOTL FROM BPSNView WHERE BPENO=@BPENO";
AddParam(cmd, "BPENO", BPENO);
string result;
ExecuteScalar(cmd, out result);
return result;
}
public bool Is管理群組(object BPENO)
{
if (BPENO == null)
return false;
DbCommand cmd = NewCommand();
cmd.CommandText =
String.Format(@"SELECT COUNT(1) FROM BWEH WHERE BPENO=@BPENO AND BPGLP IN ({0})", PublicVariable.ManagerGroup);
AddParam(cmd, "BPENO", BPENO);
int i;
ExecuteScalar(cmd, out i);
return i > 0;
}
public bool Is承辦人群組(object BPENO)
{
if (BPENO == null)
return false;
DbCommand cmd = NewCommand();
cmd.CommandText =
String.Format(@"SELECT COUNT(1) FROM BWEH WHERE BPENO=@BPENO AND BPGLP IN ({0})", PublicVariable.WorkerGroup);
AddParam(cmd, "BPENO", BPENO);
int i;
ExecuteScalar(cmd, out i);
return i > 0;
}
[DataObjectMethod(DataObjectMethodType.Select)]
public DataTable Select(string BPENO, string BPNME)
{
DbCommand cmdSelect = NewCommand();
cmdSelect.CommandText =
@"select C.BPENO AS 員工編號, C.BPNME as 員工姓名, C.BPEML as 電子郵件,
D.RAPYN AS , ISNULL('【' + I.BSSCR + '】', '') + E.BPPYM AS ,
D.RABRH AS , F.BSSCR AS ,
D.RAJNO AS , G.BPJME AS ,
D.RACNO AS , H.BPCME AS
from BPSNView C
left outer join RASN D on C.BPENO = D.RANUM and D.RAEDT is NULL
left outer join BPAA E on D.RAPYN = E.BPPYN
left outer join BCLS F on F.BSCLS = D.RABRH and F.BSPAR = 'BPSNBRH'
left outer join BPJA G on G.BPPYN = D.RAPYN and G.BPJNO = D.RAJNO
left outer join BPJB H on H.BPPYN = D.RAPYN and H.BPJNO = D.RAJNO and H.BPCNO = D.RACNO
left outer join BCLS I on I.BSCLS = SUBSTRING(D.RAPYN, LEN(D.RAPYN)-5,1) and I.BSPAR = 'BCUSZON'
where C.BPEDY is null ";
if (BPENO != null && BPENO.Length > 0)
{
cmdSelect.CommandText += " and C.BPENO like @BPENO ";
AddParam(cmdSelect, "BPENO", BPENO + "%");
}
if (BPNME != null && BPNME.Length > 0)
{
cmdSelect.CommandText += " and C.BPNME like @BPNME ";
AddParam(cmdSelect, "BPNME", BPNME + "%");
}
cmdSelect.CommandText += " order by C.BPENO";
return Select(cmdSelect);
}
}
}
@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Web;
using WebLib;
namespace Education
{
public class DAC_BRTE : DAC
{
public DAC_BRTE()
{ }
public DAC_BRTE(DbConnection conn)
: base(conn)
{ }
private decimal GetValue(string brtyp)
{
DbCommand cmd = NewCommand();
cmd.CommandText = @"SELECT TOP 1 BRRTE FROM BRTE WHERE BRTYP=@BRTYP AND BRSDT <= @TODAY ORDER BY BRSDT DESC";
AddParam(cmd, "BRTYP", brtyp);
AddParam(cmd, "TODAY", PublicVariable.TaiwanNow.Date);
ExecuteScalar<decimal>(cmd, out decimal value);
return value;
}
public decimal
{
get
{
return GetValue("領據執行業務所得課稅門檻");
}
}
public decimal
{
get
{
return GetValue("領據薪資課稅門檻");
}
}
public decimal
{
get
{
return GetValue("領據基本工資");
}
}
public decimal
{
get
{
return GetValue("領據執行業務所得稅率");
}
}
public decimal
{
get
{
return GetValue("領據薪資稅率");
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More