Compare commits

..

No commits in common. "a3858193939aa9cdac5ca05111f79e76784fa0fe" and "91543e23337ae170ee3d26618580a88f0ecfb3f7" have entirely different histories.

20 changed files with 617 additions and 1195 deletions

View File

@ -1,80 +0,0 @@
// Required modules
const router = require('express').Router();
const util = require("./../utilities/utilities_main.js");
const moment = require("moment");
router.get("/", async function(req, res) {
try {
let conn;
try {
conn = await util.getDBConnection(); // get connection from db
const query =
`
SELECT item_form.application_id, item_form.item_info_id, item_info.item_content,
item_form.application_unit,
item_form.subsidy,
scholarship_application.application_date,
scholarship_application.student_id,
student.student_name
FROM
item_form
RIGHT JOIN
scholarship_application ON item_form.application_id = scholarship_application.application_id
LEFT JOIN
student ON scholarship_application.student_id = student.student_id
LEFT JOIN
item_info ON item_form.item_info_id = item_info.item_info_id
;
`;
const result = await conn.query(query);
res.json({ success: true, data: result });
}
catch(e) {
console.error(e);
res.json({suc : false});
}
finally {
util.closeDBConnection(conn); // close db connection
}
}
catch(e) {
console.log(e);
}
})
router.post("/", async function(req, res) {
try {
if (req.body.assistant_s_num.length >= 9) {
return res.json({suc : false, msg : "invalid credentials"})
}
let conn;
try {
console.log(req.body);
// check the user is assitant
const time = moment(new Date()).format("YYYY-MM-DD");
conn = await util.getDBConnection(); // get connection from db
await conn.beginTransaction();
// insert data into table : scholarship_application
const data = [req.body.assistant_s_num, req.body.application_id, req.body.documents_ready, req.body.committee_review, req.body.meeting_name, req.body.passed_date, req.body.scholarship_amount];
const scholarship_audit_info = await conn.batch("INSERT INTO audit_form(`assistant_id`, `application_id`, `documents_ready`, `committee_review`, `meeting_name`, `passed_date`, `scholarship_amount`) VALUES(?, ?, ?, ?, ?, ?, ?);", data);
await conn.commit();
res.json({suc : true});
}
catch(e) {
console.error(e);
await conn.rollback();
res.json({suc : false});
}
finally {
util.closeDBConnection(conn); // close db connection
}
}
catch(e) {
console.log(e);
}
})
module.exports = router;

View File

@ -1,6 +1,6 @@
// Required modules
const router = require('express').Router();
const util = require("./../utilities/utilities_main.js");
const util = require("./../utilities/utilities.js");
const jwt = require('jsonwebtoken');
router.post("/", async function(req, res) {

View File

@ -1,88 +0,0 @@
// Required modules
const router = require('express').Router();
const util = require("./../utilities/utilities_main.js");
const moment = require("moment");
router.get("/", async function(req, res) {
try {
let conn;
try {
conn = await util.getDBConnection(); // get connection from db
const result = await conn.query("SELECT item_content FROM item_info;");
res.json(result);
}
catch(e) {
console.error(e);
res.json({suc : false});
}
finally {
util.closeDBConnection(conn); // close db connection
}
}
catch(e) {
console.log(e);
}
})
router.post("/", async function(req, res) {
try {
let conn;
try {
console.log(req.body);
// data
const apply_infos = req.body.apply_infos; // get data from request
const application_units = req.body.application_units;
const subsidy_amounts = req.body.subsidy_amounts;
const student_id = req.body.student_id;
const student_name = req.body.student_name;
const department_and_grade = req.body.department_and_grade;
const advisor_id = req.body.advisor_name;
const time = moment(new Date()).format("YYYY-MM-DD");
if (!student_id) {
throw new Error("Student ID is missing in the request body.");
}
conn = await util.getDBConnection(); // get connection from db
await conn.beginTransaction();
// insert into student, if not existed
const stu_existed = await conn.query("SELECT COUNT(*) FROM student WHERE student_id=?", student_id);
if (!stu_existed[0]["COUNT(*)"]) {
await conn.batch("INSERT INTO student VALUES(?, ?, ?, ?);", [student_id, department_and_grade, student_name, advisor_id]);
}
// insert data into table : scholarship_application
const scholarship_application_info = await conn.batch("INSERT INTO scholarship_application(`application_date`, `student_id`) VALUES(?, ?);", [time, student_id]);
const scholarship_application_id = scholarship_application_info.insertId; // get the application_id of previous record
// 這邊你們要再改
// const application_unit = "test unit";
// const subsidy = 1000;
console.log(scholarship_application_info.insertId);
console.log(apply_infos);
// insert each apply item into item_form
for (let i = 0;i < apply_infos.length;i++) {
await conn.batch("INSERT INTO item_form(`application_id`, `item_info_id`, `application_unit`, `subsidy`) VALUES(?, ?, ?, ?);", [scholarship_application_id, apply_infos[i], application_units[i], subsidy_amounts[i]]);
}
await conn.commit();
res.json({suc : true});
}
catch(e) {
console.error(e);
await conn.rollback();
res.json({suc : false});
}
finally {
util.closeDBConnection(conn); // close db connection
}
}
catch(e) {
console.log(e);
}
})
module.exports = router;

29
controllers/todo.js Normal file
View File

@ -0,0 +1,29 @@
// // 先從 model 引入 todos 資料
// const todoModel = require('../models/todo')
// const todoController = {
// getAll: (req, res) => {
// // 改成 callback 非同步操作
// todoModel.getAll((err, results) => {
// // 如果有 err 就印出錯誤訊息
// if (err) return console.log(err);
// // 不然就把 todos 傳給 view
// res.render('todos', {
// todos: results
// })
// })
// },
// get: (req, res) => {
// const id = req.params.id
// todoModel.get(id, (err, results) => {
// if (err) return console.log(err);
// res.render('todos', {
// // 注意回傳的結果 array必須取 results[0] 才會是一個 todo
// todos: results[0]
// })
// })
// }
// }
// module.exports = todoController

6
db.js
View File

@ -27,10 +27,10 @@ const db = require("mariadb");
// create pool
const pool = db.createPool({
connectionLimit : 10,
connectionLimit : 500,
host : 'localhost',
user : 'user',
password : '',
user : 'test',
password : '123',
database : 'scholarship'
});

View File

@ -14,17 +14,15 @@ app.use(cookieParser()); //解析 HTTP 請求的 cookie
// // routing
// // pages
app.use("/example", require("./pages/example.js"));
app.use("/main", require("./pages/main.js"));
app.use("/login", require("./pages/login.js"));
app.use("/apply", require("./pages/apply.js"));
app.use("/audit", require("./pages/audit.js"));
+app.use("/example", require("./pages/example.js"));
// app.use("/main", require("./pages/main.js"));
// app.use("/login", require("./pages/login.js"));
// app.use("/apply", require("./pages/apply.js"));
// // api
app.use("/api/login", require("./api/login.js"));
// app.use("/api/login", require("./api/login.js"));
app.use("/api/example", require("./api/example.js"));
app.use("/api/main", require("./api/main.js"));
app.use("/api/audit", require("./api/audit.js"));
// // static files
app.use('/js', express.static('./js'));
app.use('/css', express.static('./css'));
@ -50,9 +48,70 @@ app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})
// // 設定 view engine
// app.set('view engine', 'ejs')
// // 建立 todos data
// const todos = [
// 'first todo', 'second todo', 'third todo'
// ]
// app.get('/todos', (req, res) => {
// // 第二個參數可傳入資料
// res.render('todos', {
// todos // todos: todos 一樣的話可省略寫法
// })
// })
// // 加上 :id 代表不確定的參數
// app.get('/todos/:id', (req, res) => {
// // params: 可拿到網址列上指定的參數
// const id = req.params.id
// const todo = todos[id]
// res.render('todo', {
// todo
// })
// })
// app.get('/', (req, res) => {
// //res.send('index')
// })
// app.get('/main.ejs', (req, res) => {
// // 叫 express 去 render views 底下叫做 hello 的檔案,副檔名可省略
// //res.render('hello')
// })
// app.listen(port, () => {
// console.log(`listening at http://localhost:${port}`)
// })
// // 引入 controller
// const todoController = require('./controllers/todo')
// app.set('view engine', 'ejs')
// const todos = [
// 'first todo', 'second todo', 'third todo'
// ]
// // 可直接使用 controller 的方法拿取資料和進行 render
// app.get('/todos', todoController.getAll)
// app.get('/todos/:id',)
// const todoController = require('./controllers/todo')
// app.set('view engine', 'ejs')
// app.get('/todos',)
// app.get('/todos/:id', todoController.get)
// app.listen(port, () => {
// // 連線資料庫
// db.connect()
// console.log(`Example app listening at http://localhost:${port}`)
// })

View File

@ -1,249 +0,0 @@
let item_info_len = 0;
let all_audit_data = null;
let current_review_apllication_id;
const application_detail_init_table_content = document.getElementById("application_detail").innerHTML;
let assistant_s_num;
let assistant_name;
async function getItemInfo() {
// get the data from table : item_info
try {
let result = await axios.get('/api/audit');
result = result.data;
return result;
}
catch (e) {
console.error(e);
return null;
}
}
function combineSameAppData(data) {
// combine the same application id data in a same record
let n_data = {};
let next_record = true;
for (let i = 0; i < data.length; i++) {
if (i > 0 && data[i].application_id != data[i-1].application_id) {
// this record is different from the last
next_record = true;
}
if (next_record) {
// this is new record
next_record = false;
// init this record
n_data[data[i].application_id] = {};
n_data[data[i].application_id].application_id = data[i].application_id;
n_data[data[i].application_id].application_date = data[i].application_date;
n_data[data[i].application_id].student_id = data[i].student_id;
n_data[data[i].application_id].student_name = data[i].student_name;
n_data[data[i].application_id].application_units = [data[i].application_unit];
n_data[data[i].application_id].item_contents = [data[i].item_content];
n_data[data[i].application_id].subsidys = [data[i].subsidy];
}
else {
n_data[data[i].application_id].application_units.push(data[i].application_unit);
n_data[data[i].application_id].item_contents.push(data[i].item_content);
n_data[data[i].application_id].subsidys.push(data[i].subsidy);
}
}
all_audit_data = n_data;
return n_data;
}
function auditCase(application_id) {
current_review_apllication_id = application_id;
// add item content
const table_id = "application_detail";
document.getElementById(table_id).innerHTML = application_detail_init_table_content;
let table_content = document.getElementById(table_id).innerHTML;
const data = all_audit_data[application_id];
console.log(data);
table_content += "<tr>";
for (let i = 0;i < data.item_contents.length;i++) {
if (data.item_contents[i].includes("已向")) {
table_content +=
`
<td>${data.item_contents[i]} 申請單位: ${data.application_units[i]} 獲得補助金額NT$${data.subsidys[i]}</td>
`
}
else {
table_content +=
`
</tr>
<tr>
<td>${data.item_contents[i]}</td>
`
}
}
document.getElementById(table_id).innerHTML = table_content;
// add simple info
document.getElementById("application_info").innerHTML =
`
申請編號${data.application_id} <br/>
申請日期${data.application_date} <br/>
申請人姓名${data.student_name} <br/>
申請人學號${data.student_id} <br/>
申請內容
`;
console.log();
}
async function putDataInTable(table_id) {
// get data
const result = await getItemInfo();
const data = combineSameAppData(result.data);
const suc = result.success;
if (suc && data != null && table_id != null) {
// insert data into table
let table_content = document.getElementById(table_id).innerHTML;
const keys = (Object.keys(data));
let next_record = false;
let this_application_info = {};
console.log(data);
for (let i = 0; i < keys.length; i++) {
table_content +=
`
<tr>
<td>${data[keys[i]].application_id}</td>
<td>${data[keys[i]].application_date}</td>
<td>${data[keys[i]].student_id}</td>
<td>${data[keys[i]].student_name}</td>
<td><button id="audit_bt_${data[keys[i]].application_id}" onclick="auditCase(${data[keys[i]].application_id})">處理<br/>申請</button></td>
</tr>
`
;
}
/*
`<h2>證明文件是否備齊</h2>
<div>
<label>
<input type="radio" id="checkbox_yes_${i}" value="yes"/>
</label>
<label>
<input type="radio" id="checkbox_no_${i}" value="no"/>
</label>
尚須補繳<input type="text" id="unit_${i}"/>
</div>
<h2>學生事務委員會審核結果</h2>
<div>
<input type="radio" id="passed" value="passed">
<label ></label>
會議名稱("學期-次數"):<input type="text" id="passedTimes" style="width: 50px;">核發獎學金
<input type="number" id="scholarshipAmount" style="width: 100px;">
<br>
<blockquote>
<div >
<label>通過日期</label>
<input type="date" id="passed_date">
</div>
</blockquote>
</div>
<div>
<input type="radio" id="notPassed" value="notPassed">
<label>未通過</label>
</div>
<br>
<div>
<label for="noSupportProof"> 未獲補助證明檔案繳交處</label>
<input type="file" id="noSupportProof" accept=".pdf, .doc, .docx, .jpg, .jpeg, .png">
</div>
<br></br>
`
*/
// write back data into table
document.getElementById(table_id).innerHTML = table_content;
// set info length
item_info_len = data.length;
}
else {
console.error("data and table id can not be null");
}
}
async function setAssistantName() {
// get student name, and show on page
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
assistant_s_num = urlParams.get("s_num");
assistant_name = urlParams.get("name");
document.getElementById("assistant_name").innerHTML = assistant_name;
}
async function sendApplyData() {
// get student name
const student_name = document.getElementById("assistant_name").value;
// get checked infos
let apply_infos = [];
let application_units = [];
let subsidy_amounts = [];
for (let i = 0; i < item_info_len; i++) {
if (document.getElementById(`checkbox_${i}`).checked) {
apply_infos.push(i + 1);
// get unit、subsidy
if (document.getElementById(`unit_${i}`) && document.getElementById(`subsidy_${i}`)) {
application_units.push(document.getElementById(`unit_${i}`).value);
subsidy_amounts.push(document.getElementById(`subsidy_${i}`).value);
} else {
application_units.push(null);
subsidy_amounts.push(null);
}
}
}
const data = {student_id,student_name,department_and_grade, advisor_name,
apply_infos,
application_units,
subsidy_amounts
};
// send data
let result = await axios.post('/api/main', data);
console.log(result);
}
async function sendReviewResult() {
// send current review result of the application
console.log(`send current review result of the application ${current_review_apllication_id}`);
let data = {assistant_s_num, "application_id" : current_review_apllication_id};
// 你們這邊要將編號為 current_review_apllication_id 的審核表的資料送去後端處理
const doc_missing = document.getElementById("doc_checkbox_no").checked;
if (doc_missing) {
data["documents_ready"] = document.getElementById("missing_docs").value;
}
const is_passed = document.getElementById("passed").checked;
data["committee_review"] = is_passed;
if (is_passed) {
data["meeting_name"] = document.getElementById("passedTimes").value;
data["scholarship_amount"] = document.getElementById("scholarshipAmount").value;
data["passed_date"] = document.getElementById("passed_date").value;
}
console.log(data);
const result = await axios.post("/api/audit", data);
if (result.data.suc) {
alert("審核成功!");
}
else {
alert("審核失敗!", result.data.msg);
}
window.location.reload();
}
setAssistantName();
putDataInTable("application_table");

View File

@ -1,19 +1,13 @@
async function submit() {
const account = document.getElementById("account").value;
const password = document.getElementById("password").value;
console.log(account, password);
let data = {account : account, password : password};
let suc_login = await axios.post('http://163.22.17.184:5000/api/login', data);
let suc_login = await axios.post('/api/login', data);
suc_login = suc_login.data;
console.log(suc_login);
if (suc_login.suc) {
if (account.length >= 9) {
// student
location.href = `/main?name=${suc_login.authen_result}&s_num=${account}`;
}
else {
// assistant
location.href = `/audit?name=${suc_login.authen_result}&s_num=${account}`;
}
location.href = '/main';
}
else {
alert("帳號或密碼錯誤");

View File

@ -1,120 +1,17 @@
let item_info_len = 0;
console.log("hello world");
async function getItemInfo() {
// get the data from table : item_info
try {
let result = await axios.get('/api/main');
result = result.data;
return result;
}
catch (e) {
console.error(e);
return null;
}
}
async function putDataInTable(table_id) {
// get data
const data = await getItemInfo();
if (data != null && table_id != null) {
// insert data into table
let table_content = document.getElementById(table_id).innerHTML;
for (let i = 0; i < data.length; i++) {
if (i === 2 || i === 3 || i === 10 || i === 11) {
table_content += `
<blockquote>
<td><input type='checkbox' id='checkbox_${i}'/></td>
<td>${data[i].item_content}</td>
申請單位:</div><input type='text' id='unit_${i}'/>
<td>獲得補助金額NT$</div><input type='number' id='subsidy_${i}'/></td>
</blockquote>`;
} else if (i === 4 || i === 5 || i === 12 || i === 13) {
table_content += `
<tr>
<td><input type='checkbox' id='checkbox_${i}'/></td>
<td>${data[i].item_content}</td>
<td>申請單位:</div><input type='text' id='unit_${i}'/></td>
<br>
</tr>`;
} else if(i===data.length-1){
table_content += `
<tr>
<td><input type='checkbox' id='checkbox_${i}'/></td>
<td>${data[i].item_content}</td>
<td></div><input type='text' id='else_${i}'/></td>
<br>
<br>
</tr>`;
async function submit() {
const account = document.getElementById("account").value;
const password = document.getElementById("password").value;
console.log(account, password);
data = {account : account, password : password};
let suc_login = await axios.post('/login', data);
suc_login = suc_login.data;
console.log(suc_login);
if (suc_login.suc) {
location.href = '/main';
}
else {
table_content += `
<tr>
<td><input type='checkbox' id='checkbox_${i}'/></td>
<td>${data[i].item_content}</td>
<br>
</tr>`;
alert("帳號或密碼錯誤");
}
}
// write back data into table
document.getElementById(table_id).innerHTML = table_content;
// set info length
item_info_len = data.length;
}
else {
console.error("data and table id can not be null");
}
}
async function setStudentName() {
// get student name, and show on page
document.getElementById("student_name").innerHTML = "test";
}
async function sendApplyData() {
// get student name
const student_name = document.getElementById("student_name").innerHTML;
const student_id = document.getElementById("student_id").innerHTML;
const department_and_grade = document.getElementById("department_and_grade").value;
const advisor_name = document.getElementById("advisor_name").value;
// get checked infos
let apply_infos = [];
let application_units = [];
let subsidy_amounts = [];
for (let i = 0; i < item_info_len; i++) {
if (document.getElementById(`checkbox_${i}`).checked) {
apply_infos.push(i + 1);
// get unit、subsidy
if (document.getElementById(`unit_${i}`) && document.getElementById(`subsidy_${i}`)) {
application_units.push(document.getElementById(`unit_${i}`).value);
subsidy_amounts.push(document.getElementById(`subsidy_${i}`).value);
} else {
application_units.push(null);
subsidy_amounts.push(null);
}
}
}
const data = {student_id,student_name,department_and_grade, advisor_name,
apply_infos,
application_units,
subsidy_amounts
};
console.log(data);
// send data
let result = await axios.post('/api/main', data);
console.log(result);
}
function setUserInfo() {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const s_num = urlParams.get("s_num");
const name = urlParams.get("name");
document.getElementById("student_id").innerHTML = s_num;
document.getElementById("student_name").innerHTML = name;
}
setUserInfo();
putDataInTable("info_item");

24
models/todo.js Normal file
View File

@ -0,0 +1,24 @@
// // 引入 db也就是 connection
// const db = require('../db')
// const todoModel = {
// // 這裡要用 callback 來拿取資料
// getAll: (cb) => {
// db.query(
// 'SELECT * FROM todos', (err, results) => {
// if (err) return cb(err);
// // cb: 第一個參數為是否有錯誤,沒有的話就是 null第二個才是結果
// cb(null, results)
// });
// },
// get: (id, cb) => {
// db.query(
// 'SELECT * FROM todos WHERE id = ?', [id], (err, results) => {
// if (err) return cb(err);
// cb(null, results)
// });
// }
// }
// module.exports = todoModel

View File

@ -1,17 +0,0 @@
const router = require('express').Router();
const { error } = require('console');
const util = require("./../utilities/utilities_main.js");
// processing request
router.get('/', async function(req, res) {
try {
res.sendFile(util.getParentPath(__dirname) + '/templates/audit.html');
}
catch(e) {
console.log(e);
res.json({error_msg : "failed to access the file"});
}
return;
});
module.exports = router;

View File

@ -1,6 +1,5 @@
const router = require('express').Router();
const { error } = require('console');
const util = require("./../utilities/utilities_main.js");
const util = require("./../utilities/utilities.js");
// processing request
router.get('/', async function(req, res) {
@ -9,7 +8,6 @@ router.get('/', async function(req, res) {
}
catch(e) {
console.log(e);
res.json({error_msg : "failed to access the file"});
}
return;
});

View File

@ -97,8 +97,8 @@ CREATE TABLE `item_form` (
`item_id` int(4) NOT NULL,
`application_id` int(4) NOT NULL,
`item_info_id` int(4) NOT NULL,
`application_unit` varchar(50) NULL,
`subsidy` int(4) NULL
`application_unit` varchar(50) NOT NULL,
`subsidy` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- --------------------------------------------------------
@ -119,18 +119,18 @@ CREATE TABLE `item_info` (
INSERT INTO `item_info` (`item_info_id`, `item_content`) VALUES
(1, '參加校內、外(含國內、國際性)資管領域相關專業或學術性重要比賽得獎者。'),
(2, '參加國際性學術研討會或國際性會議並以外文發表論文者(不含摘要及海報論文):'),
(3, ' 已向校內申請補助'),
(4, '已向校外申請補助'),
(5, '已向校內申請補助,未獲得補助(需付未獲得補助證明)'),
(6, '已向校外申請補助,未獲得補助(需付未獲得補助證明)'),
(3, ' 已向校內申請補助,申請單位:,獲得補助金額'),
(4, '已向校外申請補助,申請單位:,獲得補助金額'),
(5, '已向校內申請補助,申請單位:,未獲得補助(需付未獲得補助證明)'),
(6, '已向校外申請補助,申請單位:未獲得補助(需付未獲得補助證明)'),
(7, '未向校內外單位申請補助'),
(8, '促進本系招生、聲譽提升、協助教學或行政工作等有具體事蹟者'),
(9, '碩士畢業生學位口試以英文發表者 參加資管領域相關學術研討會並榮獲最佳論文獎'),
(10, '獲得「國科會大專學生研究計畫獎勵」者口 學生申請國際交換生'),
(11, ' 已向校內申請補助'),
(12, '已向校外申請補助'),
(13, '已向校內申請補助,未獲得補助(需付未獲得補助證明)'),
(14, '已向校外申請補助,未獲得補助(需付未獲得補助證明)'),
(11, ' 已向校內申請補助,申請單位:,獲得補助金額'),
(12, '已向校外申請補助,申請單位:,獲得補助金額'),
(13, '已向校內申請補助,申請單位:,未獲得補助(需付未獲得補助證明)'),
(14, '已向校外申請補助,申請單位:未獲得補助(需付未獲得補助證明)'),
(15, '未向校內外單位申請補助'),
(16, '參加國內學術研討會發表論文並獲獎者'),
(17, '學生參加校外學術性比賽之交通費補助'),
@ -159,7 +159,7 @@ CREATE TABLE `student` (
`student_id` varchar(9) NOT NULL COMMENT '學號',
`departmant_and_grade` varchar(10) NOT NULL COMMENT '系級',
`student_name` varchar(20) NOT NULL COMMENT '學生姓名',
`advisor_id` int(4) NULL
`advisor_id` int(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--

View File

@ -1,105 +0,0 @@
<!DOCTYPE html>
<html>
<link href="/css/audit.css" rel="stylesheet">
<head>
<title>國立暨南國際大學資管系獎學金審核表</title>
</head>
<body>
<h1 align="center">國立暨南國際大學資管系獎學金審核表</h1>
<div id="assistant">
<div>
<label>系所助理:<span id="assistant_name"></span></label>
</div>
<br>
<div>
<label>選擇要審核的學號</label>
<select id="student_id_select">
<option value="">請選擇</option>
</select>
</div>
<br>
<fieldset>
<table border="1">
<tr>
<td>
<h2 align="center">申請資料</h2>
<table id="application_table" border="1">
<tr>
<td>申請編號</td>
<td>申請日期</td>
<td>申請人學號</td>
<td>申請人姓名</td>
</tr>
</table>
</td>
<td>
<h2 align="center">申請詳細資訊</h2>
<div id="application_info"></div>
<table id="application_detail" border="1">
</table>
</td>
<td>
<h2 align="center">申請審核</h2>
<h3>證明文件是否備齊</h3>
<div>
<label>
<input type="radio" name="doc_checkbox" id="doc_checkbox_yes"/>
</label>
<label>
<input type="radio" name="doc_checkbox" id="doc_checkbox_no"/>
</label>
,尚須補繳:<input type="text" id="missing_docs"/>
</div>
<h2>學生事務委員會審核結果</h2>
<div>
<input type="radio" name="passed" id="passed">
<label ></label>
會議名稱("學期-次數"):<input type="text" id="passedTimes" style="width: 50px;">,核發獎學金
<input type="number" id="scholarshipAmount" style="width: 100px;">
<br>
<blockquote>
<div >
<label>通過日期:</label>
<input type="date" id="passed_date">
</div>
</blockquote>
</div>
<div>
<input type="radio" name="passed" id="notPassed">
<label>未通過</label>
</div>
<br>
<div>
<label for="noSupportProof"> 未獲補助證明檔案繳交處:</label>
<input type="file" id="noSupportProof" accept=".pdf, .doc, .docx, .jpg, .jpeg, .png">
</div>
<br></br>
<button onclick="sendReviewResult()">送出審核結果</button>
</td>
</tr>
</table>
</fieldset>
<br>
<fieldset>
<h2 align="center">審核區</h2>
<table id="audit_table" border="1">
</table>
<form id="audit_item" border="1">
</form></fieldset>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios@1.6.7/dist/axios.min.js"></script>
<script src = "/js/audit.js"></script>
</html>

View File

@ -1,19 +1,27 @@
<!DOCTYPE html>
<html>
<!-- <link href="/css/??.css" rel="stylesheet"> -->
<link href="/css/main.css" rel="stylesheet">
<script src = "/js/main.js"></script>
<title>Main Page</title>
<head>
<meta charset="utf-8">
<title>國立暨南國際大學資管系獎學金申請表</title>
</head>
<body>
<h1 align="center">國立暨南國際大學資管系獎學金申請表</h1>
<form id="scholarshipForm" >
<fieldset>
<div id="student">
<div >
<label>學生姓名:<span id = "student_name"></span></label>
<label>申請日期:</label>
<input type="date" id="application_date" name="application_date" required>
</div>
<div>
<label>學號:<span id = "student_id"></span></label>
<label>申請學生:</label>
<input type="text" id="student_name" name="student_name" required>
</div>
<div>
<label>學號:</label>
<input type="text" id="student_number" name="student_number" required>
</div>
<div>
<label for="department_and_grade">系所別(年級):</label>
@ -33,34 +41,199 @@
<label for="advisor_name">導師:</label>
<select id="advisor_name" name="advisor_name" required>
<option value="">請選擇導師</option>
<option value="1">姜美玲</option>
<option value="2">戴榮賦</option>
<option value="3">陳彥錚</option>
<option value="4">黃俊哲</option>
<option value="5">白炳豐</option>
<option value="6">簡宏宇</option>
<option value="7">游子宜</option>
<option value="8">余菁蓉</option>
<option value="9">王育民</option>
<option value="10">洪嘉良</option>
<option value="11">陳小芬</option>
<option value="12">陳建宏</option>
<option value="13">鄭育評</option>
<option value="姜美玲">姜美玲</option>
<option value="戴榮賦">戴榮賦</option>
<option value="陳彥錚">陳彥錚</option>
<option value="黃俊哲">黃俊哲</option>
<option value="白炳豐">白炳豐</option>
<option value="簡宏宇">簡宏宇</option>
<option value="游子宜">游子宜</option>
<option value="余菁蓉">余菁蓉</option>
<option value="王育民">王育民</option>
<option value="洪嘉良">洪嘉良</option>
<option value="陳小芬">陳小芬</option>
<option value="陳建宏">陳建宏</option>
<option value="鄭育評">鄭育評</option>
</select>
</div>
</div>
<br>
<hr>
<h2>申請項目及說明</h2>
<form id="info_item" border="1">
<div>
<input type="checkbox" id="competitionAward" name="applicationItem" value="competitionAward">
<label for="competitionAward">參加校內、外(含國內、國際性)資管領域相關專業或學術性重要比賽得獎者</label>
</div>
<div>
<input type="checkbox" id="internationalConference" name="applicationItem" value="internationalConference">
<label for="internationalConference">參加國際性學術研討會或國際性會議並以外文發表論文者(不含摘要及海報論文)</label>
</div>
<blockquote><div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label></blockquote>
</div>
</form>
<div>
<input type="checkbox" id="promoteDepartment" name="applicationItem" value="promoteDepartment">
<label for="promoteDepartment">促進本系招生、聲譽提升、協助教學或行政工作等有具體事蹟者</label>
</div>
<div>
<input type="checkbox" id="masterThesisInEnglish" name="applicationItem" value="masterThesisInEnglish">
<label for="masterThesisInEnglish">碩士畢業生學位口試以英文發表者</label>
</div>
<div>
<input type="checkbox" id="bestPaperAward" name="applicationItem" value="bestPaperAward">
<label for="bestPaperAward">參加資管領域相關學術研討會並榮獲最佳論文獎</label>
</div>
<div>
<input type="checkbox" id="nationalScienceCouncilAward" name="applicationItem" value="nationalScienceCouncilAward">
<label for="nationalScienceCouncilAward">獲得「國科會大專學生研究計畫獎勵」者</label>
</div>
<div>
<input type="checkbox" id="internationalExchangeStudent" name="applicationItem" value="internationalExchangeStudent">
<label for="internationalExchangeStudent">學生申請國際交換生</label>
</div>
<blockquote><div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label>
</div></blockquote>
<div>
<input type="checkbox" id="undergraduateToMaster" name="applicationItem" value="undergraduateToMaster">
<label for="undergraduateToMaster">本系大學部學生報考本系碩士班經甄試或考試正取者</label>
</div>
<div>
<input type="checkbox" id="academicConferenceAward" name="applicationItem" value="academicConferenceAward">
<label for="academicConferenceAward">參加國內學術研討會發表論文並獲獎者</label>
</div>
<div>
<input type="checkbox" id="externalCompetitionTravelGrant" name="applicationItem" value="externalCompetitionTravelGrant">
<label for="externalCompetitionTravelGrant">學生參加校外學術性比賽之交通費補助</label>
</div>
<div>
<input type="checkbox" id="certificationAchievement" name="applicationItem" value="certificationAchievement">
<label for="certificationAchievement">在學學生考取TOEFL iBT 100分以上、IELTS 7分以上或日文N1、GRE 320分以上或同等證照證明</label>
</div>
<div>
<input type="checkbox" id="otherOption" name="applicationItem" value="other">
<label for="otherOption">其他:</label>
<input type="text" id="otherOptionText" name="otherOptionText">
<br>
<br>
<label for="otherOptionFile">附件上傳:</label>
<input type="file" id="otherOptionFile" name="otherOptionFile">
</div>
</fieldset>
<!-- 可以在此處繼續添加其他申請項目-->
<br>
<!-- <hr style="border-style:double; border-width: 2.5px; " > -->
<div style="border:2px black solid;">
<div>
<br>
<label><strong>系所助理:</strong></label>
<select id="assistant_name" name="assistant_name" required>
<option value="">請選系所助理</option>
<option value="王慈君">王慈君</option>
<option value="賴玫旋">賴玫旋</option>
</select>
</div>
<h2>證明文件是否備齊</h2>
<div>
<input type="radio" id="documentsReadyYes" name="documentsReady" value="yes">
<label for="documentsReadyYes"></label>
<input type="radio" id="documentsReadyNo" name="documentsReady" value="no">
<label for="documentsReadyNo">否,尚須補繳:</label>
<input type="text" id="documentsMissing" name="documentsMissing">
</div>
<h2>學生事務委員會審核結果</h2>
<div>
<input type="radio" id="passed" name="committee_review" value="passed" onclick="togglePassedDate(true)">
<label for="passed"></label>
<input type="number" id="passedTimes" name="passedTimes" min="1" style="width: 50px;" required>次通過,核發獎學金
<input type="number" id="scholarshipAmount" name="scholarshipAmount" style="width: 100px;" required>
<br>
<blockquote>
<div >
<label>通過日期:</label>
<input type="date" id="passed_date" name="passed_date" required>
</div>
</blockquote>
</div>
<div>
<input type="radio" id="notPassed" name="committeeReview" value="notPassed" onclick="togglePassedDate(false)">
<label for="notPassed">未通過</label>
</div>
<br>
<div>
<label for="noSupportProof"> 未獲補助證明檔案繳交處:</label>
<input type="file" id="noSupportProof" name="noSupportProof" accept=".pdf, .doc, .docx, .jpg, .jpeg, .png">
</div>
<br>
<div>
</div>
</div>
<div>
<p>
說明:<br>
一、依據「國立暨南國際大學資訊管理學系獎助學金作業要點」辦理。<br>
@ -68,8 +241,52 @@
三、獲得本系獎助學金補助者須提供申請事項之詳細資訊,供系上公告與相關宣傳使用。若後續有召開分享會等相關需要,獲補助者需配合辦理。
</p>
<button onclick="sendApplyData()">送出申請</button>
</div>
<br>
<input type="submit" value="提交申請">
</div>
<form id="scholarshipForm" method="post" enctype="multipart/form-data">
<!-- 若表單須通過http post方式提交至伺服器並且包括文件上傳需使用(from)這段程式碼-->
</form>
<div id="submittedData" style="display: none;">
<!-- -->
</div>
</form>
<script>
document.getElementById('scholarshipForm').onsubmit = function(event) {
event.preventDefault(); // Prevent the default form submission behavior
// Collect form data
var formData = new FormData(this);
// Convert form data to readable text format
var formContent = '';
for (var pair of formData.entries()) {
formContent += pair[0] + ': ' + pair[1] + '<br>';
}
// Open a new window to display the form content
var newWindow = window.open();
newWindow.document.write('<h1>國立暨南國際大學資管系獎學金申請內容</h1>' + formContent);
newWindow.document.close();
// Reset the form fields
this.reset();
};
</script>
</body>
<script src="https://cdn.jsdelivr.net/npm/axios@1.6.7/dist/axios.min.js"></script>
<script src = "/js/main.js"></script>
</html>

View File

@ -1,292 +0,0 @@
<!DOCTYPE html>
<html>
<link href="/css/main.css" rel="stylesheet">
<script src = "/js/main.js"></script>
<title>Main Page</title>
<head>
<meta charset="utf-8">
<title>國立暨南國際大學資管系獎學金申請表</title>
</head>
<body>
<h1 align="center">國立暨南國際大學資管系獎學金申請表</h1>
<form id="scholarshipForm" >
<fieldset>
<div >
<label>申請日期:</label>
<input type="date" id="application_date" name="application_date" required>
</div>
<div>
<label>申請學生:</label>
<input type="text" id="student_name" name="student_name" required>
</div>
<div>
<label>學號:</label>
<input type="text" id="student_id" name="student_id" required>
</div>
<div>
<label for="department_and_grade">系所別(年級):</label>
<select id="department_and_grade" name="department_and_grade" required>
<option value="">請選擇年級</option>
<option value="大一">大一</option>
<option value="大二">大二</option>
<option value="大三">大三</option>
<option value="大四">大四</option>
<option value="碩一">碩一</option>
<option value="碩二">碩二</option>
<option value="碩三">碩三</option>
<option value="碩四">碩四</option>
</select>
</div>
<div>
<label for="advisor_name">導師:</label>
<select id="advisor_name" name="advisor_name" required>
<option value="">請選擇導師</option>
<option value="姜美玲">姜美玲</option>
<option value="戴榮賦">戴榮賦</option>
<option value="陳彥錚">陳彥錚</option>
<option value="黃俊哲">黃俊哲</option>
<option value="白炳豐">白炳豐</option>
<option value="簡宏宇">簡宏宇</option>
<option value="游子宜">游子宜</option>
<option value="余菁蓉">余菁蓉</option>
<option value="王育民">王育民</option>
<option value="洪嘉良">洪嘉良</option>
<option value="陳小芬">陳小芬</option>
<option value="陳建宏">陳建宏</option>
<option value="鄭育評">鄭育評</option>
</select>
</div>
<br>
<hr>
<h2>申請項目及說明</h2>
<div>
<input type="checkbox" id="competitionAward" name="applicationItem" value="competitionAward">
<label for="competitionAward">參加校內、外(含國內、國際性)資管領域相關專業或學術性重要比賽得獎者</label>
</div>
<div>
<input type="checkbox" id="internationalConference" name="applicationItem" value="internationalConference">
<label for="internationalConference">參加國際性學術研討會或國際性會議並以外文發表論文者(不含摘要及海報論文)</label>
</div>
<blockquote><div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label></blockquote>
</div>
<div>
<input type="checkbox" id="promoteDepartment" name="applicationItem" value="promoteDepartment">
<label for="promoteDepartment">促進本系招生、聲譽提升、協助教學或行政工作等有具體事蹟者</label>
</div>
<div>
<input type="checkbox" id="masterThesisInEnglish" name="applicationItem" value="masterThesisInEnglish">
<label for="masterThesisInEnglish">碩士畢業生學位口試以英文發表者</label>
</div>
<div>
<input type="checkbox" id="bestPaperAward" name="applicationItem" value="bestPaperAward">
<label for="bestPaperAward">參加資管領域相關學術研討會並榮獲最佳論文獎</label>
</div>
<div>
<input type="checkbox" id="nationalScienceCouncilAward" name="applicationItem" value="nationalScienceCouncilAward">
<label for="nationalScienceCouncilAward">獲得「國科會大專學生研究計畫獎勵」者</label>
</div>
<div>
<input type="checkbox" id="internationalExchangeStudent" name="applicationItem" value="internationalExchangeStudent">
<label for="internationalExchangeStudent">學生申請國際交換生</label>
</div>
<blockquote><div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label>
</div></blockquote>
<div>
<input type="checkbox" id="undergraduateToMaster" name="applicationItem" value="undergraduateToMaster">
<label for="undergraduateToMaster">本系大學部學生報考本系碩士班經甄試或考試正取者</label>
</div>
<div>
<input type="checkbox" id="academicConferenceAward" name="applicationItem" value="academicConferenceAward">
<label for="academicConferenceAward">參加國內學術研討會發表論文並獲獎者</label>
</div>
<div>
<input type="checkbox" id="externalCompetitionTravelGrant" name="applicationItem" value="externalCompetitionTravelGrant">
<label for="externalCompetitionTravelGrant">學生參加校外學術性比賽之交通費補助</label>
</div>
<div>
<input type="checkbox" id="certificationAchievement" name="applicationItem" value="certificationAchievement">
<label for="certificationAchievement">在學學生考取TOEFL iBT 100分以上、IELTS 7分以上或日文N1、GRE 320分以上或同等證照證明</label>
</div>
<div>
<input type="checkbox" id="otherOption" name="applicationItem" value="other">
<label for="otherOption">其他:</label>
<input type="text" id="otherOptionText" name="otherOptionText">
<br>
<br>
<label for="otherOptionFile">附件上傳:</label>
<input type="file" id="otherOptionFile" name="otherOptionFile">
</div>
</fieldset>
<!-- 可以在此處繼續添加其他申請項目-->
<br>
<!-- <hr style="border-style:double; border-width: 2.5px; " > -->
<div style="border:2px black solid;">
<div>
<br>
<label><strong>系所助理:</strong></label>
<select id="assistant_name" name="assistant_name" required>
<option value="">請選系所助理</option>
<option value="王慈君">王慈君</option>
<option value="賴玫旋">賴玫旋</option>
</select>
</div>
<h2>證明文件是否備齊</h2>
<div>
<input type="radio" id="documentsReadyYes" name="documents_ready" value="yes">
<label for="documentsReadyYes"></label>
<input type="radio" id="documentsReadyNo" name="documents_ready" value="no">
<label for="documentsReadyNo">否,尚須補繳:</label>
<input type="text" id="documentsMissing" name="documentsMissing">
</div>
<h2>學生事務委員會審核結果</h2>
<div>
<input type="radio" id="passed" name="committee_review" value="passed" onclick="togglePassedDate(true)">
<label for="passed"></label>
<input type="number" id="passedTimes" name="passedTimes" min="1" style="width: 50px;" required>次通過,核發獎學金
<input type="number" id="scholarshipAmount" name="scholarshipAmount" style="width: 100px;" required>
<br>
<blockquote>
<div >
<label>通過日期:</label>
<input type="date" id="passed_date" name="passed_date" required>
</div>
</blockquote>
</div>
<div>
<input type="radio" id="notPassed" name="committeeReview" value="notPassed" onclick="togglePassedDate(false)">
<label for="notPassed">未通過</label>
</div>
<br>
<div>
<label for="noSupportProof"> 未獲補助證明檔案繳交處:</label>
<input type="file" id="noSupportProof" name="noSupportProof" accept=".pdf, .doc, .docx, .jpg, .jpeg, .png">
</div>
<br>
<div>
</div>
</div>
<div>
<p>
說明:<br>
一、依據「國立暨南國際大學資訊管理學系獎助學金作業要點」辦理。<br>
二、申辦流程:由學生詳填本申請書並檢附相關證明文件,逕送系辦審查資料是否齊全,提交學生事務委員會審核後,由系辦通知申請學生核定結果(獎學金將逕行撥入申請學生帳戶)。<br>
三、獲得本系獎助學金補助者須提供申請事項之詳細資訊,供系上公告與相關宣傳使用。若後續有召開分享會等相關需要,獲補助者需配合辦理。
</p>
</div>
<br>
<input type="submit" value="提交申請">
</div>
<form id="scholarshipForm" method="post" enctype="multipart/form-data">
<!-- 若表單須通過http post方式提交至伺服器並且包括文件上傳需使用(from)這段程式碼-->
</form>
<div id="submittedData" style="display: none;">
<!-- -->
</div>
</form>
<script>
document.getElementById('scholarshipForm').onsubmit = function(event) {
event.preventDefault(); // Prevent the default form submission behavior
// Collect form data
var formData = new FormData(this);
// Convert form data to readable text format
var formContent = '';
for (var pair of formData.entries()) {
formContent += pair[0] + ': ' + pair[1] + '<br>';
}
// Open a new window to display the form content
var newWindow = window.open();
newWindow.document.write('<h1>國立暨南國際大學資管系獎學金申請內容</h1>' + formContent);
newWindow.document.close();
// Reset the form fields
this.reset();
};
</script>
</body>
</html>

View File

@ -4,10 +4,10 @@ const db = require("mariadb");
// create pool
const pool = db.createPool({
connectionLimit : 50,
connectionLimit : 500,
host : 'localhost',
user : 'user',
password : '',
user : 'test',
password : '123',
database : 'scholarship'
});

View File

@ -1,133 +0,0 @@
// require module
const jwt = require('jsonwebtoken');
const db = require("mariadb");
// create pool
const pool = db.createPool({
connectionLimit : 50,
host : 'localhost',
user : 'user',
password : '',
database : 'scholarship'
});
// global variable
const jwt_key = "goodjwtkey";
module.exports = {
// shared variable
jwt_key,
// shared function
signJwtToken: function(data) {
try {
const result = jwt.sign({ data, exp: Math.floor(Date.now() / 1000) + (60 * 15) }, jwt_key);
return result;
}
catch (e) {
console.log(e);
}
},
authenToken: function(token) {
return new Promise((resolve, reject) => {
try {
const data = jwt.verify(token, jwt_key).data;
if (data.uid) {
resolve(true);
} else {
resolve(false);
}
} catch (error) {
console.error(error);
resolve(false);
}
});
},
loginAuthentication: function(account, password) {
return new Promise((resolve, reject) => { // 包裝成 Promise
const spawn = require("child_process").spawn;
const pythonScript = path.join(__dirname, 'catch.py'); // path/to/catch.py
const pythonProcess = spawn('python', [pythonScript, account, password]);
//console.log(`account: ${account}`);
//console.log(`password: ${password}`);
pythonProcess.stdout.on('data', (data) => {
data = data.toString().slice(0, -1); // remove the last char
if (data === 'login falied') {
resolve(false); // 登入失敗,解析 Promise 為 True
} else {
resolve(data.toString().trim()); // 登入成功
}
});
pythonProcess.stderr.on('data', (data) => {
console.error(`stderr: ${data.toString()}`);
});
pythonProcess.on('exit', (code) => {
//console.log(`child process exited with code ${code}`);
if (code !== 0) {
reject(new Error(`child process exited with code ${code}`)); // 非 0 退出代碼表示錯誤
}
});
pythonProcess.on('error', (err) => {
console.error(err);
reject(err); // 子進程啟動失敗
});
});
},
// get parent absolute path
getParentPath : function(dir) {
try {
n_dir = "";
dir = dir.split("");
// determine the type of slash, which will be different between windows and linux
if (dir.includes("/")) {
slash_type = "/";
}
else {
slash_type = "\\";
}
// pop the last one directory
while (dir.pop() != slash_type) {
// pass
}
// restructure the full path
for (let i = 0;i < dir.length;i++) {
n_dir += dir[i];
}
return n_dir;
}
catch(e) {
console.log(e);
}
},
// return connection of db
getDBConnection : async function() {
try {
const conn = await pool.getConnection();
return conn;
}
catch(e) {
console.error("error getting db connection : ", e);
return null;
}
},
// close connection of db
closeDBConnection : function(conn) {
try {
conn.release();
}
catch(e) {
console.error("error closing db connection : ", e);
}
}
}

3
views/todo.ejs Normal file
View File

@ -0,0 +1,3 @@
<h1>Todo</h1>
<h2><%= todo %></h2>

165
views/todos.ejs Normal file
View File

@ -0,0 +1,165 @@
<!DOCTYPE html>
<html>
<head>
<link href="/css/main.css" rel="stylesheet">
<script src="/js/main.js"></script>
<meta charset="utf-8">
<title>國立暨南國際大學資管系獎學金申請表</title>
</head>
<body>
<h1 align="center">國立暨南國際大學資管系獎學金申請表</h1>
<form id="scholarshipForm" method="post" enctype="multipart/form-data">
<fieldset>
<div>
<label>申請日期:</label>
<input type="date" id="application_date" name="application_date" required>
</div>
<div>
<label>申請學生:</label>
<input type="text" id="student_name" name="student_name" required>
</div>
<div>
<label>學號:</label>
<input type="text" id="student_number" name="student_number" required>
</div>
<div>
<label for="department_and_grade">系所別(年級):</label>
<select id="department_and_grade" name="department_and_grade" required>
<option value="">請選擇年級</option>
<% ['大一', '大二', '大三', '大四', '碩一', '碩二', '碩三', '碩四'].forEach(function(grade) { %>
<option value="<%= grade %>"><%= grade %></option>
<% }); %>
</select>
</div>
<div>
<label for="advisor_name">導師:</label>
<select id="advisor_name" name="advisor_name" required>
<option value="">請選擇導師</option>
<% ['姜美玲', '戴榮賦', '陳彥錚', '黃俊哲', '白炳豐', '簡宏宇', '游子宜', '余菁蓉', '王育民', '洪嘉良', '陳小芬', '陳建宏', '鄭育評'].forEach(function(advisor) { %>
<option value="<%= advisor %>"><%= advisor %></option>
<% }); %>
</select>
</div>
<br>
<hr>
<h2>申請項目及說明</h2>
<div>
<input type="checkbox" id="competitionAward" name="applicationItem" value="competitionAward">
<label for="competitionAward">參加校內、外(含國內、國際性)資管領域相關專業或學術性重要比賽得獎者</label>
</div>
<div>
<input type="checkbox" id="internationalConference" name="applicationItem" value="internationalConference">
<label for="internationalConference">參加國際性學術研討會或國際性會議並以外文發表論文者(不含摘要及海報論文)</label>
</div>
<blockquote>
<div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label>
</div>
</blockquote>
<div>
<input type="checkbox" id="promoteDepartment" name="applicationItem" value="promoteDepartment">
<label for="promoteDepartment">促進本系招生、聲譽提升、協助教學或行政工作等有具體事蹟者</label>
</div>
<div>
<input type="checkbox" id="masterThesisInEnglish" name="applicationItem" value="masterThesisInEnglish">
<label for="masterThesisInEnglish">碩士畢業生學位口試以英文發表者</label>
</div>
<div>
<input type="checkbox" id="bestPaperAward" name="applicationItem" value="bestPaperAward">
<label for="bestPaperAward">參加資管領域相關學術研討會並榮獲最佳論文獎</label>
</div>
<div>
<input type="checkbox" id="nationalScienceCouncilAward" name="applicationItem" value="nationalScienceCouncilAward">
<label for="nationalScienceCouncilAward">獲得「國科會大專學生研究計畫獎勵」者</label>
</div>
<div>
<input type="checkbox" id="internationalExchangeStudent" name="applicationItem" value="internationalExchangeStudent">
<label for="internationalExchangeStudent">學生申請國際交換生</label>
</div>
<blockquote>
<div>
<input type="checkbox" id="internalSupportApplied" name="supportApplied" value="internalSupportApplied">
<label for="internalSupportApplied">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnit" name="internalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="internalSupportAmount" name="internalSupportAmount">
</div>
<div>
<input type="checkbox" id="externalSupportApplied" name="supportApplied" value="externalSupportApplied">
<label for="externalSupportApplied">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnit" name="externalSupportUnit">
<label>已獲補助額度NT$</label>
<input type="number" id="externalSupportAmount" name="externalSupportAmount">
</div>
<div>
<input type="checkbox" id="internalSupportAppliedNotGranted" name="supportApplied" value="internalSupportAppliedNotGranted">
<label for="internalSupportAppliedNotGranted">已向校內申請補助,申請單位:</label>
<input type="text" id="internalSupportUnitNotGranted" name="internalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="externalSupportAppliedNotGranted" name="supportApplied" value="externalSupportAppliedNotGranted">
<label for="externalSupportAppliedNotGranted">已向校外申請補助,申請單位:</label>
<input type="text" id="externalSupportUnitNotGranted" name="externalSupportUnitNotGranted">
<label>但未獲補助(若勾選此,請檢附未獲補助證明)</label>
</div>
<div>
<input type="checkbox" id="noSupportApplied" name="supportApplied" value="noSupportApplied">
<label for="noSupportApplied">未向校內外單位申請補助</label>
</div>
</blockquote>
<div>
<input type="checkbox" id="promoteInternationalVisibility" name="applicationItem" value="promoteInternationalVisibility">
<label for="promoteInternationalVisibility">其他具體可促進本系國際化或提昇國際能見度之具體事證</label>
</div>
<div>
<label for="applicationContent">申請內容:</label>
<textarea id="applicationContent" name="applicationContent" rows="4" cols="50"></textarea>
</div>
<div>
<label for="documentUpload">申請文件上傳:</label>
<input type="file" id="documentUpload" name="documentUpload">
</div>
<br>
<hr>
<div>
<label>學生簽名:</label>
<input type="text" id="studentSignature" name="studentSignature" required>
</div>
<div>
<label>導師簽名:</label>
<input type="text" id="advisorSignature" name="advisorSignature" required>
</div>
<br>
<input type="submit" value="提交申請">
</fieldset>
</form>
</body>
</html>