1. 考勤管理-签到-前台代码实现
(1) jQuery代码,页面初始化绑定事件,怎么实现?
$(function(){
//给按钮1绑定单击事件,实现签到功能
$("#signin").click(function(){
//发送一个ajax请求,完成签到,并通过回调函数显示签到结果
$.ajax({
url:"duty?method=signin",
type:"POST",
dataType:"text",
success:function(data){
//显示签到的结果 0 1 2
if(data==0){
$("#result").html("签到失败");
}else if(data==1){
$("#result").html("签到成功");
}else{
$("#result").html("已经签到,不能重复签到");
}
}
});
})
//给按钮2绑定单击事件,实现签退功能
});
2. 考勤管理-签到-全部功能实现
(1) 简述签到功能的逻辑?
根据数据库的请求数据来判断用户的签到状态,即0未签到,1签到成功,2已经签到不能重复签到。
(2) ajax实现的步骤?
首先给签到按钮添加单击事件。然后在绑定函数里创建ajax请求,向dutyServlet发送请求获得用户签到状态信息,然后根据返回结果在回调函数里给用户显示不同的反馈。
3. 签退-全部功能实现
(1) 简述签退逻辑。
当接收到网页的签退请求后,发送ajax请求至servlet,servlet进一步根据session中存储的emp当前登录用户信息中empid和当前登录时间dtdate来查找数据库中的签到信息,如果没有查找到相关记录,则提示用户尚未签到,如果查询到了,就将当前时间设置为签退时间并返回提示签退成功
4. 通过Ajax获取查询条件之部门列表
(1) 进入考勤管理页面之后,如何加载所属部门下拉列表?
在dutyList.jsp页面加载完成时发起ajax请求访问servlet中findAllDept方法获得所有部门信息,然后把Gson.toJson之后的字符串deptList信息response.getWriter.println来直接输出发回给ajax。ajax在回调函数中拼接字符串,然后填充标签.html。
(2) 点击查询后,显示所有签到信息,如何利用ajax实现,简述过程?
给查询按钮绑定单击事件,通过ajax发送请求至dutyServlet的findDuty方法,并打包用户设置的查询条件,然后根据用户设置的条件去数据库请求数据,获取到dutyList数据后再返回给ajax,通过遍历来显示到页面上。
5. 考勤管理-使用Ajax查询考勤信息
(1) 按照条件查询,可以有两种方式,第一种:点击查询按钮之后,请求后台servlet,然后从servlet中跳转到考勤管理页面,还有一种方式:利用ajax查询,请问这两种方式哪一种比较好?优点是什么呢?
使用ajax比较好,应为ajax是局部刷新,不会影响其他地方的数据,同时灵活方便还降低了对服务器的资源消耗。
1. 使用Ajax查询考勤信息2
(1) 如何拼接考勤信息列表字符串?
//拼接考勤信息列表字符串
var str ="";
for(var i=0;i<arr.length;i++){
str += '<tr>'+
'<td>'+
'<input name="" type="checkbox" value="" />'+
'</td>'+
'<td>'+arr[i].emp.empid+'</td>'+
'<td>'+arr[i].emp.realname+'</td>'+
'<td>'+arr[i].emp.dept.deptname+'</td>'+
'<td>'+arr[i].dtdate+'</td>'+
'<td>'+arr[i].signintime+'</td>'+
'<td>'+arr[i].signouttime+'</td>'+
'</tr>';
}
2. 考勤管理-使用Ajax查询考勤信息3
(1) 如何在后台sql中进行条件的拼接?
StringBuilder sql = new StringBuilder("select dt.*,e.realname,e.empid,de.deptname,de.deptno"
+" from duty dt"
+" left join employee e"
+" on dt.emprid=e.empid"
+" left join dept de"
+" on e.deptno=de.deptno where 1=1 ");
if (empid!=null&&"".equals(empid)) {
sql.append(" and dt.empid= '"+empid+"'");
}
if (deptno!=0) {
sql.append(" and de.deptno="+deptno);
}
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (dtdate!=null) {
String sdtdate = sdf.format(dtdate);
sql.append(" and to_char(dt.dtdate,'yyyy-MM-dd')>= '"+sdtdate+"'");
}
3. 考勤管理-使用POI导出考勤数据到xls1
(1) POI干嘛的?
可以实现java程序对MS Office文件的读写操作。
(2) POI和JXL的区别?
JXL:对中文支持比较好,是纯java API,可以跨平台。
POI:功能强大,支持函数和宏以及格式等操作,但是代码不成熟,不支持跨平台。
4. 考勤管理-使用POI导出考勤数据到xls2
(1) 如何使用POI,简述步骤?
将poi的jar包复制粘贴到webroot下的lib文件夹,系统会自动添加路径。
(2) 如何将后台查到的考勤数据,弄到前台客户端下载为excel,代码如何实现呢?
public void exportXls(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取三个查询条件
String empid = req.getParameter("empid");
String sdeptno = req.getParameter("deptno");
int deptno = 0;
if (sdeptno!=null) {
deptno=Integer.parseInt(sdeptno);
}
String sdtdate = req.getParameter("dtdate");
java.sql.Date dtdate = null;
try {
dtdate=java.sql.Date.valueOf(sdtdate);
} catch (RuntimeException e) {
e.printStackTrace();
}
//调用业务层获取所有的部门
List<Duty> dutyList=ds.findDuty(empid,deptno,dtdate);
//返回OutputStream
createExcel(dutyList,resp);
}
private static void createExcel(List<Duty> list,HttpServletResponse resp) {
// 创建一个Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一个工作表
HSSFSheet sheet = workbook.createSheet("考勤表一");
CellRangeAddress region = new CellRangeAddress(0, // first row
0, // last row
0, // first column
2 // last column
);
sheet.addMergedRegion(region);
HSSFRow hssfRow = sheet.createRow(0);
HSSFCell headCell = hssfRow.createCell(0);
headCell.setCellValue("员工考勤列表");
// 设置单元格格式居中
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
/*
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// cellStyle.setFillBackgroundColor(HSSFColor.GREEN.index);
cellStyle.setFillForegroundColor(HSSFColor.GREEN.index);
HSSFFont font = workbook.createFont();
font.setFontName("楷体"); //字体
font.setFontHeightInPoints((short)30); //字体大小
font.setColor(HSSFColor.RED.index);//颜色
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
font.setItalic(true); //倾斜
cellStyle.setFont(font);
*/
headCell.setCellStyle(cellStyle);
// 添加表头行
hssfRow = sheet.createRow(1);
// 添加表头内容
headCell = hssfRow.createCell(0);
headCell.setCellValue("用户名");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(1);
headCell.setCellValue("真实姓名");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(2);
headCell.setCellValue("所属部门");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(0);
headCell.setCellValue("出勤日期");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(1);
headCell.setCellValue("签到时间");
headCell.setCellStyle(cellStyle);
headCell = hssfRow.createCell(2);
headCell.setCellValue("签退时间");
headCell.setCellStyle(cellStyle);
// 添加数据内容
for (int i = 0; i < list.size(); i++) {
hssfRow = sheet.createRow((int) i + 2);
Duty duty = list.get(i);
// 创建单元格,并设置值
HSSFCell cell = hssfRow.createCell(0);
cell.setCellValue(duty.getEmp().getEmpid());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(1);
cell.setCellValue(duty.getEmp().getRealname());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(2);
cell.setCellValue(duty.getEmp().getDept().getDeptname());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(3);
cell.setCellValue(duty.getDtdate());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(4);
cell.setCellValue(duty.getSignintime());
cell.setCellStyle(cellStyle);
cell = hssfRow.createCell(5);
cell.setCellValue(duty.getSignouttime());
cell.setCellStyle(cellStyle);
}
// 保存Excel文件
try {
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("Content-disposition", "attachment;filename=duty.xls");//附件形式下载,
// OutputStream outputStream = new FileOutputStream("D:/students.xls"); 写到服务器
//写到本地
ServletOutputStream outputStream = resp.getOutputStream();
workbook.write(outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(3) 简述给出的OperateExcelUtil.java的功能含义?
可以将查询到的考勤信息从数据库导出到客户端本地,以excel的形式。同时还能修改表格的样式和内容。
5. 报销管理-理解数据库表和创建实体类
(1) 简述系统中表之间的关系:
报销单表是主表,每个报销单包含多个报销单明细表、支出表、报销单上传图片表、报销单审核表。
6. 报销管理-添加报销单-视图层
(1) 在完成视图层操作中,有哪些注意事项?
报销人、审核人已经确定,不需要输入;
报销时间、报销总额不需要输入;
报销单明细类型采用静态类型,可以增加报销单明细类型表。
JQuery技巧:增加报销单项,增加上传文件项。
(2) 在页面中,如何利用jQuery完成添加报销项操作?
function addExpenseItem(id){
//获取上级标签
var table = $(id);
//创建当前标签
var content = $('<tr>'+
'<td><div class="vocation"><select class="select1">'+
'<option value="1">通信费用</option><option value="2">办公室耗材</option><option value="3">住宿费用</option><option value="4">房租水电</option><option value="5">其他</option>'+
'</select></div></td>'+
'<td><input name="" type="text" class="dfinput" /><i></i></td>'+
'<td><input name="" type="text" class="dfinput" /><i></i></td>'+
'<td><input type="button" class="btn" value="删除" οnclick="removeCurrItem(this)"/></td></tr>');
//加入上级标签
table.append(content);
$(".select1").uedSelect({
width : 345
});
}
(3) 在页面中,如何利用jQuery完成添加图片操作?
function addPhoto(){
//获取上传图片li
var li = $("#uploadphoto");
//http://console.info(li);
//准备添加的dom对象
var content=$("<span><label> </label><input name='photo' type='file' class='dfinput' /><i></i>"+
"<input type='button' class='btn' value='删除' οnclick='removeCurrSpan(this)'/></span>");
//加入到指定位置
li.append(content);
}
7. 报销管理-添加报销单-控制层
(1) 页面中假如添加了多个报销项,那么在控制层接收数据的思路是什么呢?怎么接收数据呢?
用request.getParameterValues(“name”)来接收各个报销项不同属性的值的list集合,然后再循环遍历取出其中的值封装在ExpenseItem对象中,然后将组成的itemList封装到Expense对象中。
(2) 为什么在数据库中有状态码字段,这个字段的作用是什么?缺少这个字段可以吗?
来表示报销单目前的审核状态:1:审核中 2 审核结束通过 3 审核结束驳回
不可以,这个字段表名了报销单当前的状态,虽然在审核信息表里也有该字段,但是该字段信息需要在多个表中频繁被查询,所以适当的冗余可以提高查询效率。