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,225 @@
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="火車票價匯出匯入.ascx.cs" Inherits="Education.Forms.領據系統.火車票價匯出匯入" %>
<div id="TrainFareImportExportAPP" style="padding: 1rem 0">
<!-- 訊息浮動提示 -->
<transition name="toast">
<div v-show="ShowMessage" :class="['toast-message', 'toast-' + MessageType]">
<span class="toast-icon">
<template v-if="MessageType === 'success'">✓</template>
<template v-else-if="MessageType === 'error'">✕</template>
<template v-else-if="MessageType === 'warning'">⚠</template>
<template v-else></template>
</span>
<span class="toast-text">{{MessageText}}</span>
</div>
</transition>
<!-- Tab 切換 -->
<div style="margin-bottom: 1rem; border-bottom: 1px solid #ddd;">
<button type="button"
@click="activeTab = 'export'"
:class="['tab-button', {active: activeTab === 'export'}]">
匯出
</button>
<button type="button"
@click="activeTab = 'import'"
:class="['tab-button', {active: activeTab === 'import'}]">
匯入
</button>
</div>
<!-- 匯出頁籤 -->
<div v-if="activeTab === 'export'" style="margin-top: 1rem;">
<div style="margin-bottom: 1rem;">
<label>選擇要匯出的版本:</label>
<select v-model="exportVersionId" class="inputFull" style="margin-top: 0.5rem;">
<option value="">請選擇版本...</option>
<option v-for="version in versions" :key="version.Value" :value="version.Value">
{{version.Name}}
</option>
</select>
</div>
<div style="margin-bottom: 1rem;">
<button type="button" class="button blue120" @click="DownloadTemplate" style="margin-right: 1rem;">
下載匯入範本
</button>
<button type="button" class="button green120" @click="ExportData" v-if="exportVersionId">
匯出為 Excel
</button>
</div>
<!-- 預覽表格 -->
<div v-if="exportVersionId && exportResponse && Object.keys(exportData).length > 0" style="margin-top: 1rem;">
<h4>預覽資料:</h4>
<table style="table-layout: fixed;">
<thead>
<tr>
<th style="width: 80px;">訖站\起站</th>
<th v-for="originStation in exportOriginStations" :key="originStation" style="width: 60px;">
{{originStation}}
</th>
</tr>
</thead>
<tbody>
<tr v-for="destStation in exportDestStations" :key="destStation">
<th style="text-align: center; background-color: #f5f5f5;">{{destStation}}</th>
<td v-for="originStation in exportOriginStations" :key="originStation"
:style="originStation === destStation ? {backgroundColor: '#f0f0f0'} : {}"
style="text-align: right; padding: 8px;">
<template v-if="originStation === destStation">
-
</template>
<template v-else>
{{GetExportFare(originStation, destStation)}}
</template>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 匯入頁籤 -->
<div v-if="activeTab === 'import'" style="margin-top: 1rem;">
<div style="margin-bottom: 1rem;">
<p style="color: #666; margin-bottom: 1rem;">
<strong>說明:</strong>每次匯入都將建立為新版本,版本號自動遞增。
</p>
</div>
<div style="margin-bottom: 1rem;">
<label>選擇 Excel 檔案:</label>
<input type="file" @change="OnFileSelected" accept=".xlsx,.xls" style="margin-top: 0.5rem;" />
<div style="color: #999; font-size: 12px; margin-top: 0.5rem;">
支援 .xlsx 和 .xls 格式
</div>
</div>
<button type="button" class="button blue80" @click="ImportData"
:disabled="isImportButtonDisabled"
:style="isImportButtonDisabled ? {opacity: 0.5, cursor: 'not-allowed'} : {}"
v-if="selectedFile" style="margin-right: 1rem;">
匯入
</button>
<button type="button" class="button gray40" @click="CancelImport" v-if="selectedFile">
取消
</button>
<!-- 檢查結果 -->
<div v-if="checkResult" style="margin-top: 1rem; padding: 1rem; border: 1px solid #ddd; border-radius: 4px;">
<div v-if="checkResult.success" style="color: #4caf50; background-color: #f1f8e9; padding: 1rem; border-radius: 4px;">
<strong>檢查成功</strong><br/>
請點擊「匯入」按鈕執行匯入。
</div>
<div v-else style="color: #f44336; background-color: #ffebee; padding: 1rem; border-radius: 4px;">
<strong>檢查失敗</strong><br/>
<div v-for="(error, idx) in checkResult.errors" :key="idx">
{{error}}
</div>
</div>
</div>
<!-- 預覽表格 -->
<div v-if="checkResult && checkResult.success && Object.keys(importPreviewData).length > 0" style="margin-top: 1rem;">
<h4>預覽資料:</h4>
<table style="table-layout: fixed;">
<thead>
<tr>
<th style="width: 80px;">訖站\起站</th>
<th v-for="originStation in importOriginStations" :key="originStation" style="width: 60px;">
{{originStation}}
</th>
</tr>
</thead>
<tbody>
<tr v-for="destStation in importDestStations" :key="destStation">
<th style="text-align: center; background-color: #f5f5f5;">{{destStation}}</th>
<td v-for="originStation in importOriginStations" :key="originStation"
:style="originStation === destStation ? {backgroundColor: '#f0f0f0'} : {}"
style="text-align: right; padding: 8px;">
<template v-if="originStation === destStation">
-
</template>
<template v-else>
{{GetImportFare(originStation, destStation)}}
</template>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<style>
#TrainFareImportExportAPP table {
width: 100%;
border-collapse: collapse;
margin-top: 1rem;
}
#TrainFareImportExportAPP th,
#TrainFareImportExportAPP td {
border: 1px solid #ddd;
padding: 8px;
vertical-align: middle;
}
#TrainFareImportExportAPP th {
background-color: #f5f5f5;
font-weight: bold;
text-align: center;
}
.tab-button {
padding: 10px 20px;
border: none;
background-color: transparent;
cursor: pointer;
border-bottom: 3px solid transparent;
margin-right: 10px;
font-size: 14px;
}
.tab-button.active {
border-bottom-color: #1890ff;
color: #1890ff;
font-weight: bold;
}
.tab-button:hover {
background-color: #f5f5f5;
}
.inputFull {
width: 100%;
padding: 4px 8px;
border: 1px solid #ddd;
border-radius: 2px;
}
#TrainFareImportExportAPP button {
margin: 2px;
}
/* 訊息浮動提示圖示與文字樣式 */
.toast-message {
display: flex;
align-items: center;
min-width: 300px;
font-size: 14px;
}
.toast-icon {
font-size: 20px;
font-weight: bold;
margin-right: 12px;
flex-shrink: 0;
}
.toast-text {
flex: 1;
word-break: break-word;
}
</style>