migrate to new git

This commit is contained in:
2025-08-29 01:27:25 +08:00
parent 946eb9961e
commit af2c152ef6
8623 changed files with 1000453 additions and 1 deletions

571
web/admin/HR/reg.aspx Normal file
View File

@@ -0,0 +1,571 @@
<%@ Page Title="後端管理" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="reg.aspx.cs" Inherits="admin_hr_reg" ValidateRequest="false" %>
<%@ Register Src="~/admin/_uc/alert.ascx" TagPrefix="uc1" TagName="alert" %>
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" runat="Server">
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
<%--<link href="<%=ResolveUrl("~/js/vuetify_ez.css")%>" rel="stylesheet" />--%>
<script>
function checkNumber(btn) {
$('#errormsg').hide();
var _txt = $(btn).val();
$.ajax({
method: "POST",
url: "reg.aspx",
data: {
type: 'chkNo',
txt: _txt,
id: '<%= Request["num"]%>'
},
error: function (xhr, status, error) {
var errorMessage = xhr.status + ': ' + xhr.statusText
//alert('Error - ' + errorMessage);
console.log('Error - ' + errorMessage);
}
}).done(function (data) {
if (data.isOk) {
} else {
console.log(data.msg);
$('#errormsg').text(data.msg);
$('#errormsg').show();
}
});
}
// 模組化工作: 結合: UC, MIXIN...
let VueApp = new Vue({
el: '#app',
vuetify: new Vuetify(vuetify_options),
data() {
return {
hr_id: '<%= Request["num"] %>',
admin_id: '<%=_admin_id %>',
options: {},
search_dialog: {
controls: {
search1: {
id: 'search1',
title: '信眾',
text_prop: 'f_number',
value_prop: 'num',
keys: [
{ id: 'f_number', title: '編號', value: '' },
{ id: 'u_name', title: '姓名', value: '' },
{ id: 'address', title: '地址', value: '' },
],
api_url: HTTP_HOST + 'api/follower/GetList',
columns: [
{ id: 'f_number', title: '編號'},
{ id: 'u_name', title: '姓名'},
{ id: 'address', title: '地址'},
],
selected: {},
select(t) {
console.log("select search1", t);
$('#<%= u_name.ClientID %>').val(t.u_name);
$('#<%= sex.ClientID %>').val(t.sex.replace('眾', ''));
$('#<%= birthday.ClientID %>').val(moment(t.birthday).format('YYYY-MM-DD'));
$('#<%= phone.ClientID %>').val(t.phoneDes);
$('#<%= refuge_name.ClientID %>').val(t.refuge_name);
$('#<%= refugedate.ClientID %>').val(moment(t.refugedate).format('YYYY-MM-DD'));
$('#<%= email.ClientID %>').val(t.email);
$('#<%= address2.ClientID %>').val(t.address);
}
},
search2: {
id: 'search2',
title: '系統帳號',
text_prop: 'u_id',
value_prop: 'num',
keys: [
{ id: 'u_id', title: '帳號', value: '' },
{ id: 'power', title: '群組', value: '' },
{ id: 'u_name', title: '姓名', value: '' },
],
api_url: HTTP_HOST + 'api/adminUser/GetList',
columns: [
{ id: 'u_id', title: '帳號', value: '' },
{ id: 'power', title: '群組', value: '' },
{ id: 'u_name', title: '姓名', value: '' },
],
selected: {},
select(t) {
console.log("select search2", t);
}
},
search3: {
id: 'search3',
title: '組別',
text_prop: 'kind',
value_prop: 'num',
keys: [
{ id: 'kind', title: '組別名稱', value: '' },
],
api_url: HTTP_HOST + 'api/member/GetGroupList',
columns: [
{ id: 'kind', title: '組別名稱', value: '' },
],
selected: {},
select(t) {
console.log("select search3", t);
}
},
search4: {
id: 'search4',
title: '職稱',
text_prop: 'kind',
value_prop: 'num',
keys: [
{ id: 'kind', title: '職稱', value: '' },
],
api_url: HTTP_HOST + 'api/member/GetTitleList',
columns: [
{ id: 'kind', title: '職稱', value: '' },
],
selected: {},
select(t) {
console.log("select search4", t);
}
},
},
show: false,
current: {},
list: [],
count: 0,
page:1,
loading: false,
footer: {
showFirstLastPage: true,
disableItemsPerPage: true,
itemsPerPageAllText: '',
itemsPerPageText:'',
},
},
snackbar: {
show: false,
text: "",
}
}
},
mounted() {
this.search_dialog.current = this.search_dialog.controls.search1
//console.log("mounted");
},
watch: {
options: {
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
this.search_get()
console.log("watch2", this.search_dialog, this.search_dialog.page);
},
deep: true,
},
},
methods: {
search_show(curr) {
//console.log("btn_click:", curr, curr.api_url);
this.search_dialog.current = curr;
this.search_clear()
//this.search_get()//清除完自動會重抓, 故取消
this.search_dialog.show = true;
},
search_clear() {
if (!this.search_dialog.current.keys) return;
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
this.search_get()
},
search_get() {
if (!this.search_dialog.current.keys) return;
let api_url = this.search_dialog.current.api_url;
let keys = this.search_dialog.current.keys;
//const { page, itemsPerPage } = this.options
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
this.search_dialog.page = this.options.page??1
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
var search = {};//post body
keys.forEach((t, i) => {
search[t.id] = t.value;
});
//necessary parameter===
if (this.search_dialog.current.id == 'search2') {
search['num'] = this.admin_id;
search['removeExist'] = true;
}
if (this.search_dialog.current.id == 'search4') {
search['inTime'] = (this.hr_id != '' ? false : true);
}
console.log("search_get", api_url, search, params, this.options);
this.search_dialog.loading = true
axios.post(api_url, search, { params: params })
.then(response => {
this.search_dialog.list = response.data.list
this.search_dialog.count = response.data.count
this.search_dialog.loading = false
})
.catch(error => {
console.log(error)
this.search_dialog.list = []
this.search_dialog.count = 0
this.search_dialog.loading = false
this.snackbar.text = "錯誤:" + error
this.snackbar.show=true
})
},
search_headers() {
if (!this.search_dialog.current.columns) return;
r = [];
this.search_dialog.current.columns.forEach((t, i) => {
r.push({
text: t.title,
align: 'start',
sortable: false,
value: t.id,
})
})
return r
},
search_select(row) {
let curr = this.search_dialog.current;
let target = $(`[data-search-control=${curr.id}]`);
curr.selected = row;
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
if (curr.select instanceof Function) {
curr.select(row);
}
this.search_dialog.show = false;
console.log(row, row["u_name"], row["f_number"], curr.id, target);
},
},
computed: {
},
})
</script>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
</div>
<div class="">
<asp:Button ID="add" runat="server" Text="送出" OnClick="add_Click" CssClass="btn btn-primary" />
<asp:Button ID="edit" runat="server" Text="修改" Visible="false" OnClick="edit_Click" CssClass="btn btn-primary" />
<asp:Button ID="goback" runat="server" Text="回列表" Visible="false" CausesValidation="false" OnClick="goback_Click" CssClass="btn btn-outline-secondary" />
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<uc1:alert runat="server" ID="L_msg" Text="" />
<div id="content" class="container-xl">
<div class="card shadow-sm my-2" id="sec2">
<div class="card-header py-0">
<nav class="navbar py-0">
<div class="nav nav-tabs">
<button class="nav-link active" id="sec2-tab1" data-bs-toggle="tab" data-bs-target="#sec2-page1"
type="button" role="tab" aria-controls="home" aria-selected="true">
基本資料</button>
<button class="nav-link" id="sec2-tab2" data-bs-toggle="tab" data-bs-target="#sec2-page2"
type="button" role="tab" aria-controls="profile" aria-selected="false">
職務管理</button>
<button class="nav-link" id="sec2-tab3" data-bs-toggle="tab" data-bs-target="#sec2-page3"
type="button" role="tab" aria-controls="profile" aria-selected="false">
聯絡方式</button>
<button class="nav-link" id="sec2-tab4" data-bs-toggle="tab" data-bs-target="#sec2-page4"
type="button" role="tab" aria-controls="profile" aria-selected="false">
圖片管理</button>
</div>
</nav>
</div>
<div class="card-body">
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="sec2-page1" role="tabpanel" aria-labelledby="sec2-tab1">
<div>
<div class="form-text text-muted">以下 * 欄位為必填欄位</div>
</div>
<div class="label-sm-right">
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">信眾編號</label>
<div class="col-sm-4 col-lg-3">
<div class="input-group mb-3" data-search-control="search1" @click="search_show(search_dialog.controls.search1)">
<input class="form-control search-text" type="text" readonly
id="f_num_txt" runat="server" placeholder="信眾" value="" >
<asp:HiddenField ID="f_num" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button" >
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">人員編號 *</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="m_number" MaxLength="20" runat="server" CssClass="form-control" onchange="checkNumber(this)" placeholder="請輸入人員編號"></asp:TextBox>
<span id="errormsg" class="text-danger" style="display:none;"></span>
<asp:RequiredFieldValidator ID="RequiredFieldValidator4" ControlToValidate="m_number" runat="server"
ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">人員姓名 *</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="u_name" MaxLength="20" runat="server" CssClass="form-control" placeholder="請輸入人員姓名"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator7" ControlToValidate="u_name" runat="server"
ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">性別</label>
<div class="col-sm-4 col-lg-3">
<asp:DropDownList ID="sex" CssClass="form-select" runat="server">
<asp:ListItem Value="" Text="請選擇"></asp:ListItem>
<asp:ListItem Value="男" Text="男"></asp:ListItem>
<asp:ListItem Value="女" Text="女"></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="sex" Visible="false" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">身分證字號</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="id_code" MaxLength="10" runat="server" CssClass="form-control" data-encrypt="Y" placeholder="請輸入身分證字號"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator8" ControlToValidate="id_code" Visible="false" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">生日</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="birthday" runat="server" CssClass="form-control " TextMode="Date" autocomplete="off" data-date-format="yyyy-mm-dd"></asp:TextBox>
</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">血型</label>
<div class="col-sm-4 col-lg-3">
<asp:DropDownList ID="blood" CssClass="form-select" runat="server">
<asp:ListItem Value="" Text="請選擇"></asp:ListItem>
<asp:ListItem Value="A" Text="A型"></asp:ListItem>
<asp:ListItem Value="B" Text="B型"></asp:ListItem>
<asp:ListItem Value="AB" Text="AB型"></asp:ListItem>
<asp:ListItem Value="O" Text="O型"></asp:ListItem>
</asp:DropDownList>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">最高學歷</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="educational" MaxLength="100" runat="server" CssClass="form-control" placeholder="請輸入最高學歷"></asp:TextBox>
</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">皈依日期</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="refugedate" runat="server" CssClass="form-control " TextMode="Date" autocomplete="off" data-date-format="yyyy-mm-dd"></asp:TextBox>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">皈依法名</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="refuge_name" MaxLength="20" runat="server" CssClass="form-control" placeholder="請輸入皈依法名"></asp:TextBox>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">皈依道場</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="refuge_area" MaxLength="50" runat="server" CssClass="form-control" placeholder="請輸入皈依道場"></asp:TextBox>
</div>
</div>
</div>
<hr />
<div class="row mb-1">
<label class="col-form-label">備註</label>
<div class="">
<asp:TextBox ID="demo" runat="server" Rows="5" TextMode="MultiLine" CssClass="form-control" placeholder="請輸入備註"></asp:TextBox>
</div>
</div>
</div>
<div class="tab-pane fade label-sm-right" id="sec2-page2" role="tabpanel" aria-labelledby="sec2-tab2">
<div>
<div class="form-text text-muted">以下 * 欄位為必填欄位</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">系統帳號</label>
<div class="col-sm-4 col-lg-3">
<%--<asp:DropDownList ID="admin_num" CssClass="form-select" runat="server" data-int="Y">
<asp:ListItem Value="" Text="請選擇"></asp:ListItem>
</asp:DropDownList>--%>
<div class="input-group mb-3" data-search-control="search2" @click="search_show(search_dialog.controls.search2)">
<input class="form-control search-text" type="text" readonly
id="admin_num_txt" runat="server" placeholder="系統帳號" value="" >
<asp:HiddenField ID="admin_num" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button" >
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">到職日期</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="takedate" runat="server" CssClass="form-control " TextMode="Date" autocomplete="off" data-date-format="yyyy-mm-dd"></asp:TextBox>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">離職日期</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="leavedate" runat="server" CssClass="form-control " TextMode="Date" autocomplete="off" data-date-format="yyyy-mm-dd"></asp:TextBox>
</div>
</div>
<div class="row mb-1 ">
<label class="col-sm-2 col-lg-1 col-form-label">薪資</label>
<div class="col-sm-4 col-lg-3">
<asp:TextBox ID="salary" MaxLength="10" runat="server" CssClass="form-control" TextMode="Number" placeholder="請輸入薪資"></asp:TextBox>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">組別</label>
<div class="col-sm-4 col-lg-3">
<div class="input-group mb-3" data-search-control="search3" @click="search_show(search_dialog.controls.search3)">
<input class="form-control search-text" type="text" readonly
id="group_kind_txt" runat="server" placeholder="組別" value="" >
<asp:HiddenField ID="group_kind" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button" >
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="group_kind_txt" Visible="false" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
<label class="col-sm-2 col-lg-1 col-form-label">職稱</label>
<div class="col-sm-4 col-lg-3">
<div class="input-group mb-3" data-search-control="search4" @click="search_show(search_dialog.controls.search4)">
<input class="form-control search-text" type="text" readonly
id="title_kind_txt" runat="server" placeholder="職稱" value="" >
<asp:HiddenField ID="title_kind" runat="server" Value="" />
<button class="btn btn-outline-secondary" type="button" >
<i class="mdi mdi-view-list-outline"></i>
</button>
</div>
<asp:RequiredFieldValidator ID="RequiredFieldValidator10" ControlToValidate="title_kind_txt" Visible="false" runat="server" ErrorMessage="必填!" Display="Dynamic" SetFocusOnError="true"></asp:RequiredFieldValidator>
</div>
</div>
</div>
<div class="tab-pane fade label-sm-right" id="sec2-page3" role="tabpanel" aria-labelledby="sec2-tab3">
<div class="row mb-1">
<label class="col-sm-2 col-form-label">聯絡電話</label>
<div class="col-sm-10">
<asp:TextBox ID="phone" MaxLength="15" runat="server" CssClass="form-control" data-encrypt="Y" placeholder="請輸入聯絡電話,如: 04-2237-0000"></asp:TextBox>
<asp:RegularExpressionValidator ControlToValidate="phone" ErrorMessage="格式有誤" ID="RegularExpressionValidator3" runat="server" ValidationExpression="^[+-]?\d+([+-]?\d*)*$" Display="Dynamic" SetFocusOnError="true" />
</div>
</div>
<div class="row mb-1">
<label class="col-sm-2 col-form-label">公司電子信箱</label>
<div class="col-sm-10">
<asp:TextBox ID="com_email" MaxLength="200" runat="server" CssClass="form-control" placeholder="請輸入公司電子信箱"></asp:TextBox>
<asp:RegularExpressionValidator ControlToValidate="com_email" Display="Dynamic" SetFocusOnError="true" ErrorMessage="格式有誤!" ID="RegularExpressionValidator2" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" />
</div>
</div>
<div class="row mb-1">
<label class="col-sm-2 col-form-label">個人電子信箱</label>
<div class="col-sm-10">
<asp:TextBox ID="email" MaxLength="200" runat="server" CssClass="form-control" placeholder="請輸入個人電子信箱"></asp:TextBox>
<asp:RegularExpressionValidator ControlToValidate="email" Display="Dynamic" SetFocusOnError="true" ErrorMessage="格式有誤!" ID="RegularExpressionValidator1" runat="server" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" />
</div>
</div>
<div class="row mb-1">
<label class="col-sm-2 col-form-label">其他聯絡方式</label>
<div class="col-sm-10">
<asp:TextBox ID="contact" MaxLength="100" runat="server" CssClass="form-control" placeholder="請輸入其他聯絡方式"></asp:TextBox>
</div>
</div>
<div class="row mb-1">
<label class="col-sm-2 col-form-label">戶籍地址</label>
<div class="col-sm-10">
<asp:TextBox ID="address1" MaxLength="200" runat="server" CssClass="form-control" placeholder="請輸入戶籍地址"></asp:TextBox>
</div>
</div>
<div class="row mb-1">
<label class="col-sm-2 col-form-label">居住地址</label>
<div class="col-sm-10">
<asp:TextBox ID="address2" MaxLength="200" runat="server" CssClass="form-control" placeholder="請輸入居住地址"></asp:TextBox>
</div>
</div>
</div>
<div class="tab-pane fade" id="sec2-page4" role="tabpanel" aria-labelledby="sec2-tab4">
<asp:Panel ID="Panel1" runat="server" CssClass="row mb-1">
<div class="border rounded col-md-4">
<p class="form-control-static" style="height: 35px">建議尺寸300*300象素 &nbsp;<asp:CheckBox ID="CheckBox1" Text="刪除" runat="server" Visible="false" /></p>
<table border="0">
<tr>
<td><asp:FileUpload ID="FileUpload1" runat="server" /></td>
</tr>
<tr>
<td width="160" height="160">
<asp:Image ID="Image1" runat="server" Visible="false" ImageUrl="~/admin/images/showpic.gif" /></td>
</tr>
</table>
</div>
</asp:Panel>
</div>
</div>
</div>
</div>
<v-dialog v-model="search_dialog.show" max-width="500px">
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
查詢:{{search_dialog.current.title}}
<v-btn icon @click="search_dialog.show=false"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
<v-col v-for="item in search_dialog.current.keys"
:cols="search_dialog.current.keys.length>1?6:12" >
<v-text-field v-model="item.value" :label="item.title"></v-text-field>
</v-col>
<v-col cols="12" class="text-end">
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
</v-col>
</v-row>
<v-data-table
:headers="search_headers()"
:items="search_dialog.list"
:footer-props="search_dialog.footer"
:items-per-page="10"
:server-items-length="search_dialog.count"
:page.sync="search_dialog.page"
:options.sync="options"
@click:row="search_select"
></v-data-table>
</v-card-text>
<v-card-actions>
</v-card-actions>
</v-card>
</v-dialog>
<v-snackbar
v-model="snackbar.show"
timeout="2000"
>
{{ snackbar.text }}
<template v-slot:action="{ attrs }">
<v-btn
text
v-bind="attrs"
@click="snackbar.show = false"
>
關閉
</v-btn>
</template>
</v-snackbar>
</div>
</asp:Content>