一个网页版的请休假功能,代码包含以下几个文件,数据库是MSSQL,查询和新增操作正常 ,希望在页面的员工姓名这个text中,添加一个查询功能,实现点击此按钮后,弹出一个查询窗口,输入员工姓名或者工号查询,查询结果出来后,双击或者选中某条记录后点确定,将数据带回主页面的员工工号,部门,职位这几个text中,请各位帮忙看看。
另外,请假类型这个控件,目前和员工姓名在同一行,怎样让它另起一行?
我知道可以将
<form action="/leave" method="POST" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-5 gap-4 mb-8">
这行代码中grid-cols-5改成grid-cols-4来实现,但是我想开始日期和结束日期,开始时间,结束时间这四个控件也另起一行,请假类型单独一行显示。
目前 页面显示效果

index.ejs文件内容
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>请假管理系统</title>
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
</head>
<body class="bg-gray-100">
<div class="container mx-auto px-4 py-8 max-w-6xl">
<div class="bg-white rounded-xl shadow-lg overflow-hidden p-6 mb-8">
<h1 class="text-3xl font-bold text-blue-600 mb-6">
<i class="fas fa-calendar-alt mr-2"></i>请假管理系统
</h1>
<% if (messages.error) { %>
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 mb-4 rounded">
<i class="fas fa-exclamation-circle mr-2"></i><%= messages.error %>
</div>
<% } %>
<% if (messages.success) { %>
<div class="bg-green-100 border-l-4 border-green-500 text-green-700 p-4 mb-4 rounded">
<i class="fas fa-check-circle mr-2"></i><%= messages.success %>
</div>
<% } %>
<form action="/leave" method="POST" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
<div>
<label class="block text-gray-700 mb-2 font-medium">员工姓名</label>
<input type="text" name="employeeName" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">员工工号</label>
<input type="text" name="employeeNumber" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">部门</label>
<input type="text" name="employeeName" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">职位</label>
<input type="text" name="employeeName" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">请假类型</label>
<select name="leaveType" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
<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>
<label class="block text-gray-700 mb-2 font-medium">开始日期</label>
<input type="date" name="startDate" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">开始时间</label>
<input type="time" name="startTime" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">结束日期</label>
<input type="date" name="endDate" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">结束时间</label>
<input type="time" name="endTime" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div class="md:col-span-2">
<label class="block text-gray-700 mb-2 font-medium">请假原因</label>
<input type="text" name="reason" required
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div class="md:col-span-2 lg:col-span-1 flex items-end">
<button type="submit"
class="w-full bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg transition duration-300 font-medium">
<i class="fas fa-plus mr-2"></i>提交申请
</button>
</div>
</form>
</div>
<div class="bg-white rounded-xl shadow-lg overflow-hidden p-6 mb-8">
<h2 class="text-xl font-semibold text-gray-800 mb-4">
<i class="fas fa-search mr-2"></i>请假记录查询
</h2>
<form action="/search" method="GET" class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div>
<label class="block text-gray-700 mb-2 font-medium">员工姓名</label>
<input type="text" name="employeeName"
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div>
<label class="block text-gray-700 mb-2 font-medium">请假类型</label>
<select name="leaveType"
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
<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>
<label class="block text-gray-700 mb-2 font-medium">开始日期</label>
<input type="date" name="startDate"
class="w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition">
</div>
<div class="flex items-end">
<button type="submit"
class="w-full bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-lg transition duration-300 font-medium">
<i class="fas fa-search mr-2"></i>查询
</button>
</div>
</form>
</div>
<div class="bg-white rounded-xl shadow-lg overflow-hidden">
<div class="px-6 py-4 border-b">
<h2 class="text-xl font-semibold text-gray-800">
<i class="fas fa-list mr-2"></i>请假记录清单
</h2>
</div>
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">员工</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">项目</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">类别</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">开始日期</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">结束日期</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">请假天数</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">请假小时</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">原因</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<% leaves.forEach(leave => { %>
<tr class="hover:bg-gray-50 transition duration-150">
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
<%= leave.EmployeeName %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= leave.LeaveItem %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= leave.LeaveType %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= new Date(leave.StartDate).toLocaleDateString() %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= new Date(leave.EndDate).toLocaleDateString() %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= leave.LeaveDay %>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<%= leave.LeaveHour %>
</td>
<td class="px-6 py-4 text-sm text-gray-500">
<%= leave.Reason %>
</td>
</tr>
<% }); %>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
app.js 文件内容
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const flash = require('connect-flash');
const sql = require('mssql');
const path = require('path');
const { log } = require('console');
require('dotenv').config();
const app = express();
const PORT = process.env.PORT || 3000;
// 数据库配置
const dbConfig = {
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
server: process.env.DB_SERVER,
database: process.env.DB_NAME,
options: {
encrypt: false,//true时为https 加密访问,mssql不支持
trustServerCertificate: true,
port:1433
}
};
// 中间件
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'leave-system-secret',
resave: false,
saveUninitialized: true
}));
app.use(flash());
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static(path.join(__dirname, 'public')));
// 路由 - 查询请假记录
app.get('/', async (req, res) => {
try {
const pool = await sql.connect(dbConfig);
const result = await pool.request()
.query('SELECT * FROM LeaveApplications ORDER BY StartDate DESC');
res.render('index', {
leaves: result.recordset,
messages: req.flash()
});
} catch (err) {
console.error("数据库连接或者查询错误",err);
req.flash('error', '查询请假记录失败');
res.render('index', { leaves: [], messages: req.flash() });
}
});
// 路由 - 新增请假记录
app.post('/leave', async (req, res) => {
const { employeeName, leaveType, startDate, endDate, reason } = req.body;
try {
const pool = await sql.connect(dbConfig);
await pool.request()
.input('employeeName', sql.NVarChar, employeeName)
.input('leaveType', sql.NVarChar, leaveType)
.input('startDate', sql.Date, startDate)
.input('endDate', sql.Date, endDate)
.input('reason', sql.NVarChar, reason)
.query(`INSERT INTO LeaveApplications
(EmployeeName, LeaveType, StartDate, EndDate, Reason)
VALUES (@employeeName, @leaveType, @startDate, @endDate, @reason)`);
req.flash('success', '请假申请提交成功');
} catch (err) {
req.flash('error', '提交请假申请失败');
} finally {
res.redirect('/');
}
});
// 路由 - 条件查询请假记录
app.get('/search', async (req, res) => {
const { employeeName, leaveType, startDate } = req.query;
try {
const pool = await sql.connect(dbConfig);
let query = 'select EmployeeName, LeaveItem, LeaveType, StartDate, EndDate, LeaveDay, LeaveHour, Reason from LeaveApplications WHERE 1=1';
const request = pool.request();
if (employeeName) {
query += ' AND Employeename LIKE @employeeName';
request.input('employeeName', sql.NVarChar, `%${employeeName}%`);
}
if (leaveType) {
query += ' AND LeaveType = @leaveType';
request.input('leaveType', sql.NVarChar, leaveType);
}
if (startDate) {
query += ' AND StartDate >= @startDate';
request.input('startDate', sql.Date, startDate);
}
query += ' ORDER BY startDate DESC';
const result = await request.query(query);
res.render('index', {
leaves: result.recordset,
messages: req.flash()
});
} catch (err) {
console.error('查询错误:', err);
req.flash('error', '查询请假记录失败: ' + err.message);
res.render('index', { leaves: [], messages: req.flash() });
}
});
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});
.env文件内容
DB_USER=sa
DB_PASSWORD=password
DB_SERVER=192.168.1.4
DB_NAME=Database
package.json文件内容
{
"name": "leave-request",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"body-parser": "^2.2.0",
"connect-flash": "^0.1.1",
"dotenv": "^17.2.1",
"ejs": "^3.1.10",
"express": "^5.1.0",
"express-session": "^1.18.2",
"mssql": "^11.0.1"
}
}