本系统是使用SSM框架进行系统的搭建,并且使用MySQL作为数据库管理系统,开发环境是Eclipse,服务器采用Tomcat8.5。主要实现企业对雇员考勤记录和办公用品进行管理,里面分为了三个角色:超级管理员、部门经理和雇员,也可以添加其他角色。超级管理员可对系统进行全面管理,本系统有很高的使用价值,应用前景广阔。
本软件就是专门对企业考勤和办公用品进行管理,系统的主要功能包括:部门信息管理、角色管理、雇员管理、请假申请、请假审批、雇员出勤管理、办公用品出入库、办公用品使用申请、办公用品使用审核、权限分配等。
本论文对企业考勤管理系统的设计与实现进行了一系列的分析,系统需求分析,总体设计分析,详细细节设计分析,从开发环境、目标、流程、功能等方面都进行了总体规划。最后对系统进行了测试,系统运行正常,是一款值得应用推广的企业考勤管理系统。
关键词:SSM框架;MySQL;管理系统;Tomcat8.5
Design and Implementation of Enterprise Attendance Management System Based on SSM
Major: Grade Class: Student: Supervisor:
Abstract: This system uses SSM framework to build the system, and uses MySQL as the database management system. The development environment is eclipse, and the server uses Tomcat8.5. It mainly realizes the management of employee attendance records and office supplies, which is divided into three roles: Super administrator, Department Manager and employee. Other roles can also be added. Super administrator can manage the system comprehensively. This system has high use value and broad application prospect.
The main functions of the system include: Department information management, role management, employee management, leave application, leave approval, employee attendance management, office supplies warehousing, office supplies use application, office supplies use audit, authority allocation, etc.
This paper carries out a series of analysis on the design and implementation of enterprise attendance management system, including system requirements analysis, overall design analysis, detailed design analysis, and overall planning from the development environment, objectives, processes, functions and other aspects. Finally, the system is tested, the system runs normally, is a worthy of application and promotion of enterprise attendance management system.
Keywords: SSM framework; MySQL; management system; Tomcat8.5
第一章 绪论 1
1.1项目背景 1
1.2目的和意义 1
1.3 应用推广 2
第二章 概要设计 3
2.1项目体系结构 3
2.2登录模块 4
2.2.1系统用例分析 5
2.3系统管理模块 6
2.4个人信息模块 7
2.5日常考勤模块 7
2.6请假管理模块 8
2.7办公用品模块 8
2.8系统公告模块 9
第三章 数据库设计 11
3.1数据库的分析与设计 11
3.1.1数据库的概念结构设计 11
3.1.2数据库的逻辑结构设计 15
3.1.3数据库的连接 21
第四章 详细设计与实现 23
4.1登录模块的设计实现 23
4.2系统管理模块的设计实现 25
4.2.1部门管理 27
4.2.2角色管理 29
4.3 个人信息模块的设计实现 30
4.4 日常考勤模块的设计实现 32
4.5 请假管理模块的设计实现 34
4.6 办公用品模块的设计实现 35
4.7 系统公告的设计实现 37
第五章 系统测试 39
5.1测试用例及结果 39
5.2测试后的改进方案 40
总结 41
参考文献 43
致谢 45
1.1项目背景
随着技术的迅速发展,人们的生活正在向信息化时代发展,同时,各种软件也慢慢走进了规模不一的各种企业单位。我们的生活到处都需要建立规则,只有遵守好规则,生活才不会乱,才会有秩序,对于企业来说,加强对企业的管理是每个企业必不可少的。企业人事管理比较复杂,员工是否上班需要记录,每个人的上下班出勤情况也需要记录,然而传统的单人记录考勤即复杂,还需要消耗大量的人力和财力资源,而且这样的记录非常容易出现差错,并且大型企业员工太多,想单独寻找一个员工记录非常麻烦,而且企业办公用具的有序管理也是企业必不可少的,办公用品的出入库以及使用情况都需要精确的管理,使用办公管理系统可以完美的解决这个问题。
1.2目的和意义
一直以来,企业雇员的考勤管理工作大部分都采用的是手动记录的方式来记录考勤信息,这种考勤的方式有很多缺点,比如说,雇员请假、审批等信息的查询,分析这些数据都完全需要雇员自己用纸和笔记录,企业办公用品的管理也是需要雇员的手动记录,这样大大的增加了管理难度,效率极其低下。对于小型一点的企业来说,这种方式还可以勉强接受,但时对于大型的企业来说,专门找一个雇员来记录这些是异常辛苦且麻烦的。为了满足企业发展需求,而企业考勤管理系统就是专门针对企业员工的日常考勤记录和企业办公用品进行管理,提高企业员工的工作效率,查询员工的考勤情况,减少工作量,使企业员工管理工作变得更加井井有条且自动化[1],避免员工的工作随意性,提高信息的准确性,能够及时准确的查询企业员工信息以及考勤情况,使企业雇员从堆积如山的数据信息中脱出身来,减少每天的工作量。
1.3 应用推广
当前社会和科学飞速发展,计算机软件作为当今社会计算机应用中的一个重要组成部分,使用企业考勤管理系统对企业员工和企业办公用品进行管理,有查找快速、封闭性性强、存储空间大、保存时间长、成本低等优点,这些优点是用人工来记录所无法比较的,它能提高企业对内部的事宜管理的效率,也是每个企业走向自动化、科学化管理和与世界前沿技术接轨的必要条件[2]。
企业考勤管理系统就是把企业雇员每天的考勤信息实现统一集中的管理,利用计算机存储查询不仅有防火、防盗等优点,而且还为企业的雇员考勤解决了后顾之忧。
本系统不仅能企业为提供信息检索[3]和信息存取服务,而且还能提供办公用品的出入库、请假申请、请假审批和系统的公告等功能。本系统大致上能够满足企业考勤和办公用品的管理的需求。可以方便企业管理员对信息的添加、查询和修改等[4]。
2.1项目体系结构
在开发企业考勤管理系统时,第一步需要进行对整个系统的需求进行分析,接着再对系统的总体进行分析设计,然后设计系统主要的功能模块,数据库的选择设计等,本系统的开发流程如图2.1所示:
图2.1开发流程图
本系统项目功能结构图如图2.2所示:
图2.2功能结构图
2.2登录模块
为保证程序系统的安全,使用本系统必须先登录,并且根据工号的角色不同,登录后的功能权限也不同,其登录流程图如图2.3所示:
图2.3登录流程图
2.2.1系统用例分析
(1)管理员用例
超级管理员可实现个人信息、日常考勤、请假管理、办公用品、系统公告、系统管理等功能。管理员用例图如图2.4所示:
图2.4管理员用例图
(2)部门经理用例
部门经理可实现个人信息、日常考勤、请假管理、申请办公用品、查看系统公告等功能。部门经理用例图如图2.5所示:
图2.5管理员用例图
(3)雇员用例
普通员工可实现个人信息、日常考勤、请假申请和办公用品申请。管理员用例图如图2.6所示:
图2.6 雇员用例图
2.3系统管理模块
系统管理是超级管理员进行雇员管理、角色管理和部门的管理,并且可以对每个角色进行权限分配,一般超级管理员可实现个人信息、日常考勤、请假管理、办公用品、系统公告、系统管理里的所有功能;部门经理可实现个人信息、日常考勤、请假管理、申请办公用品、查看系统公告;普通员工和组长可实现个人信息、日常考勤、请假申请和办公用品申请。超级管理员系统管理E-R图如图2.7所示:
图2.7系统管理E-R图
2.4个人信息模块
此模块用于每个角色对自己的信息进行修改,登录密码的修改。个人信息E-R图如图2.8所示:
图2.8个人信息E-R图
2.5日常考勤模块
此模块功能包括上下班打卡、雇员打卡记录查询、考勤记录查询,其中雇员打卡记录查询只能部门经理和超级管理员能查看,普通员工和组长只能查询自己的考勤记录。管理员日常考勤E-R图如图2.9所示,雇员日常考勤E-R图如图2.10所示:
图2.9 管理员日常考勤E-R图
图2.10 雇员日常考勤E-R图
2.6请假管理模块
此模块用于雇员向经理或超级管理员提交请假申请,经理和超级管理员收到信息后可审核该请假条,等经理和管理员审核过后可查看是否通过,超级管理员请假管理E-R图如图2.11所示,雇员请假申请E-R图如图2.12所示:
图2.11 管理员请假管理E-R图
图2.12 雇员请假申请E-R图
2.7办公用品模块
此模块用于办公用品的管理,有仓库入库记录、申请办公用品审批、申请办公用品、申请记录、仓库管理、仓库入库等功能,超级管理员可实现里面所有功能,普通员工只能实现申请办公用品和查看申请记录,超级管理员办公用品E-R图如图2.13所示,雇员办公用品E-R图如图2.14所示:
图2.13管理员办公用品管理E-R图
图2.14 雇员办公用品申请E-R图
2.8系统公告模块
此模块用于超级管理员和部门经理发送公告给指定的部门或某个人发送公告通知,有系统公告记录和系统公告管理,超级管理员系统公告管理E-R图如图2.15所示,雇员系统公告E-R图如图2.16所示:
图2.15 管理员系统公告管理E-R图
图2.16 雇员系统公告E-R图
3.1数据库的分析与设计
如今,计算机信息系统的核心是以数据库管理系统 [5],计算机软件在数据库管理系统的帮助下,可以对收集的信息进行存储、整理、查询、修改、统计和加工等操作。数据库管理系统到目前是信息系统的基础 [6],数据库设计得好不好将会大部分影响到整个系统的质量[7]。
3.1.1数据库的概念结构设计
我们在需求分析阶段里面获得的软件需求应该要先抽象成为信息世界的结构[8],然后才能更精准的用一个数据库来完成这些需求[9]。
概念模型是每个数据模型建立的首要条件,它比数据模型更加抽象,所以他比数据模型更加稳定。描述概念模型最形象最具体的是E-R模型。
数据库的概念结构设计统一采用的是实体—联系[10](E-R)模型。组成E-R模型的元素有:联系、属性和实体,E-R模型是采用E-R图来展示出来的。
根据上面我们对数据库的理解与分析,建立E-R模型图。
(1)雇员信息实体E-R图如图3.1所示:
图3.1 雇员信息实体E-R图
(2)部门信息实体E-R图如图3.2所示:
图3.2 部门信息实体E-R图
(3)出勤信息E-R图如图3.3所示:
图3.3 出勤信息实体E-R图
(4)请假信息E-R图如图3.4所示:
图3.4 请假信息实体E-R图
(5)公告信息E-R图如图3.5所示:
图3.5 公告信息实体E-R图
(6)公告接收信息E-R图如图3.6所示:
图3.6 公告接收信息实体E-R图
(7)角色信息E-R图如图3.7所示:
图3.7 角色信息实体E-R图
(8)菜单栏信息E-R图如图3.8所示:
图3.8 菜单栏信息实体E-R图
(9)角色菜单权限信息E-R图如图3.9所示:
图3.9 角色菜单权限信息实体E-R图
(10)办公用品信息E-R图如图3.10所示:
图3.10 办公用品信息实体E-R图
(11)办公用品入库信息E-R图如图3.11所示:
图3.11 办公用品入库信息实体E-R图
(12)办公用品申请审核信息E-R图如图3.12所示:
图3.12 办公用品申请审核信息实体E-R图
3.1.2数据库的逻辑结构设计
数据库概念模型是从的数据库管理系统中孤立出来的,所以我们需要通过系统的使用情况去设计数据表。即将数据转变成用计算机的观念来解决的逻辑模型,也就是将E-R模型变成关系模型,转变时我们必须遵守以下原则[11]:
3.1.3数据库的连接
程序运行少不了数据库的支持,想让程序连接到数据库,必不可少的是数据库的连接[12],通过对数据库的连接,完成程序的信息储存和检索。关键代码如下:
在企业考勤管理系统中,完成了需求分析和系统设计等过程后,就需要对系统的详细功能进行设计和实现 [14]。,我们需要对每个模块的功能一一实现,并且将界面美化,让用户有良好的体验感,因此我们在详细设计与实现时,必须做到仔细细心、有创意感,这样做出来的系统才能算得上是一个完整的系统。
4.1登录模块的设计实现
在登陆页面输入用户名和密码后,输入验证码进行人机判断,点击登录按钮,在系统验证输入的账号和密码是否填写正确,再验证输入的验证码是否正确,如果正确,则跳转到登陆后的主页中,并根据相应的用户角色进入对应的页面,效果图如图4.1所示:
图4.1登录界面
登录时关键代码:
4.2系统管理模块的设计实现
系统管理是超级管理员进行雇员管理、角色管理和部门的管理,并且可以对每个角色进行权限分配,雇员管理里可实现:添加雇员、删除雇员、修改角色、修改部门、查找雇员等功能,主界面如图4.2所示:
图4.2雇员管理主页面
(1)雇员信息录入
此功能主要是录入雇员的基本信息,包括姓名、工号、角色、部门、手机号、状态等,效果图如图4.3所示:
图4.3雇员信息录入
(2)修改雇员信息
此功能主要是修改已录用的雇员信息,可实现修改雇员工号、姓名、部门、角色、手机号和状态等,效果图如图4.4所示:
图4.4修改雇员信息
(3)查找雇员信息
此功能主要是查找已录用的雇员信息,查找的条件可为雇员工号、姓名、部门、手机号等来查询,效果图如图4.5所示:
图4.5查找雇员信息
(4)删除雇员信息
此功能主要是删除已录用的雇员信息,效果图如图4.6所示:
图4.6删除雇员信息
4.2.1部门管理
部门管理模块主要能实现添加和删除部门、修改部门信息,主页如图4.7所示:
图4.7部门管理主页
(1) 添加部门
此功能是添加公司部门,效果图如图4.8所示:
图4.8添加部门
(2) 修改部门信息
此功能是修改现有的部门信息,包括部门名称、部门简介、使用状态等,效果图如图4.9所示:
图4.9修改部门信息
(3) 删除部门信息
此功能是删除不需要的部门的信息,效果图如图4.10所示:
图4.10删除部门信息
4.2.2角色管理
角色管理模块主要功能有添加删除角色、权限分配、修改角色,主页如图4.11所示:
图4.11角色管理
其中关键代码如下:
try {
String roleId = request.getParameter(“roleId”);
Integer[] menuIds = JSONObject.parseObject(request.getParameter(“menuIdList”), Integer[].class);
roleService.batchDeleteRoleByMenu(Integer.parseInt(roleId)); //先删除
if (roleService.batchAddRoleByMenu(Integer.parseInt(roleId), menuIds) > 0) {
json.put(“type”, “success”);
json.put(“msg”, “设置角色菜单成功”);
return json;
}
} catch (Exception e) {
json.put(“type”, “error”);
json.put(“msg”, “系统错误!请联系管理员”);
System.out.println(e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //回滚
}
json.put(“type”, “error”);
json.put(“msg”, “设置角色菜单失败!”);
return json;
}
4.3 个人信息模块的设计实现
个人信息模块用于每个角色对自己的信息进行修改,包括姓名、性别、手机号码、出生年月、家庭住址、邮箱和头像等通过表单提交修改,
(1)修改登录密码
登录后对个人的密码进行修改,如图4.12所示
图4.12修改密码
(2)个人资料
登录后可对自己的基本信息进行添加修改,效果如图4.1所示:
图4.13个人资料
其中关键代码如下:
public JSONObject uploadPhoto(HttpServletRequest request, MultipartFile file) {
JSONObject json = new JSONObject();
try {
if (file.isEmpty()) {
json.put(“type”, “error”);
json.put(“msg”, “上传文件不能为空!”);
} else {
String employeeNumber = SecurityUtils.getSubject().getPrincipal().toString();
String originalFilename = file.getOriginalFilename(); //文件名
//创建要上传的路径
File file1 = new File(request.getContextPath() + “/” + “src/main/webapp/WEB-INF/employee/” + employeeNumber + “/”);
if (!file1.exists()) {
file1.mkdirs();
}
//文件上传到路径下
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(file1, “photo.png”));
json.put(“type”, “success”);
json.put(“msg”, “上传成功!”);
json.put(“value”, “src/main/webapp/WEB-INF/employee/” + employeeNumber + “/photo.png”);
}
} catch (Exception e) {
json.put(“type”, “error”);
json.put(“msg”, e.getMessage());
}
return json;
}
4.4 日常考勤模块的设计实现
日常考勤功能包括上下班打卡、雇员打卡记录查询、考勤记录查询,效果图如图4.14所示:
图4.14上下班签到
关键代码如下:
//判断今天是否打过卡
if (punchDao.selectEmployeePunchByNumber(employeeNumber, punchClassifyInt, formatLeading.format(new Date())) != null) {
//如果打过卡
String str = “上班签到”;
if (punchClassifyInt == 2) str = “下班签退”;
json.put(“type”, “error”);
json.put(“msg”, “今天已经打过” + str + “卡了!”);
return json;
}
//保存打卡记录
Punch punch = new Punch();
punch.setEmployeeId(punchDao.selectEmployeeIdByNumber(employeeNumber));
punch.setPunchClassify(punchClassifyInt);
punch.setPunchStatus(1);
punch.setPunchDay(formatLeading.format(new Date()));
if (punchDao.addPunchCard(punch) > 0) {
//如果保存成功
json.put("type", "success");
json.put("msg", "打卡成功!");
return json;
}
} catch (Exception e) {
json.put("type", "error");
json.put("msg", MessageError.SYSTEM_ERROR);
System.out.println(e.getMessage());
return json;
}
json.put("type", "error");
json.put("msg", "打卡失败!");
return json;
4.5 请假管理模块的设计实现
请假管理用于雇员向经理或超级管理员提交请假申请,经理和超级管理员收到信息后可审核该请假条,等经理和管理员审核过后可查看是否通过,效果图如图4.15所示:
图4.15填写请假单
关键代码如下:
public JSONObject addLeave(HttpServletRequest request) {
JSONObject json = new JSONObject();
try {
String leaveStr = request.getParameter(“leave”);
if (leaveStr == null) {
json.put(“type”, “error”);
json.put(“msg”, “获取请假信息失败!”);
return json;
}
/** 对表单校验*/
Leave leave = JSONObject.parseObject(leaveStr, Leave.class);
if (leaveDao.verifyLeave(leave) <= 0) {
json.put(“type”, “error”);
json.put(“msg”, “填写信息不正确!”);
return json;
}
if (leaveDao.addLeave(leave) > 0) {
json.put(“type”, “success”);
json.put(“msg”, “请假单已发送给部门经理,审核完后在查收!”);
return json;
}
} catch (Exception e) {
json.put(“type”, “error”);
json.put(“msg”, MessageError.SYSTEM_ERROR);
System.out.println(e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return json;
}
json.put(“type”, “error”);
json.put(“msg”, “添加请假单失败!”);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return json;
}
4.6 办公用品模块的设计实现
办公用品用于办公用品的管理,有仓库入库记录、申请办公用品审批、申请办公用品、申请记录、仓库管理、仓库入库等功能,效果图如图4.16所示:
图4.16填写请假单
关键代码如下:
public JSONObject applyForOfficeSupplies(HttpServletRequest request) {
JSONObject json = new JSONObject();
try {
String stationeryProposerStr = request.getParameter(“stationeryProposer”);
String employeeNumber = SecurityUtils.getSubject().getPrincipal().toString(); //得到自身工号
if (stationeryProposerStr == null || employeeNumber == null) {
json.put(“type”, “error”);
json.put(“msg”, “获取数据失败!”);
return json;
}
StationeryProposer stationeryProposer = JSONObject.parseObject(stationeryProposerStr, StationeryProposer.class);
stationeryProposer.setApproveEmployeeId(stationeryDao.selectEmployeeIdByDepartmentHeadId(DepartmentHead.DepartmentAdministrative));
if (stationeryDao.applicationForOfficeSupplies(stationeryProposer, employeeNumber) > 0) {
//如果大于0|成功
json.put(“type”, “success”);
json.put(“msg”, “申请成功,请等待审批!”);
return json;
}
} catch (Exception e) {
json.put(“type”, “error”);
json.put(“msg”, MessageError.SYSTEM_ERROR);
System.out.println(e.getMessage());
return json;
}
json.put(“type”, “error”);
json.put(“msg”, “申请失败!”);
return json;
}
4.7 系统公告的设计实现
系统公告是用于超级管理员和部门经理发送公告给指定的部门或某个人发送公告通知,有系统公告记录和系统公告管理,效果图如图4.17所示:
图4.17发布系统公告
关键代码如下:
public JSONObject flagNotice(HttpServletRequest request) {
JSONObject json = new JSONObject();
try {
String employeeNumber = SecurityUtils.getSubject().getPrincipal().toString(); //得到自身工号
String noticeIdStr = request.getParameter("noticeId");
if (noticeIdStr == null || employeeNumber == null) {
json.put("type", "error");
json.put("msg", "接收数据为空!");
return json;
}
int noticeId = Integer.parseInt(noticeIdStr);
if (noticeDao.flagNotice(noticeId, employeeNumber) > 0) {
json.put("type", "success");
json.put("msg", "已阅成功!");
return json;
}
} catch (Exception e) {
json.put("type", "error");
json.put("msg", MessageError.SYSTEM_ERROR);
System.out.println(e.getMessage());
return json;
}
json.put("type", "error");
json.put("msg", "已阅失败!");
return json;
}
系统测试是系统最后的检测,进行系统测试是希望能用在项目发布前来发现系统存在的各种错误 [15]。过程应该通过开发阶段时的需求进行测试,然后采用这些例子来测试程序,通过测试的结果来查看程序是否存在错误。一般系统测试里面包含了硬件测试[16] 、软件测试和网络测试,其中网络测试和硬件测试一般采用性能指标来完成,我们这里提到的测试大部分指的是软件测试[17],这些测试时保障系统最可靠的依据。
每个系统进行测试是为了确保软件系统是否可以推广利用的重要步骤,是系统开发过程中的最后检查。我们根据软件测试的概念和目的,在进行对系统测试时应该遵守软件测试的原则[18]。
5.1测试用例及结果
测试过程: 1.系统登录界面,输入错误的登录账号密码
2.点击登录,显示登录结果。
3.输入正确的登录账号密码
4.点击登录。
5.得出测试结果如表5.1所示。
表5.1
模块名称 测试用例 预期结果 实际结果 是否通过
登录模块 账号:
密码: 弹出错误提示:必须项不能为空 登陆失败,提示必须项不能为空 通过
登录模块 账号:100001
密码: 弹出错误提示:必须项不能为空 登录失败,提示必须项不能为空 通过
登录模块 账号:100001
密码:1 弹出错误提示:,用户名或者密码错误 登陆失败,提示用户名或者密码错误 通过
登录模块 用户名:100001
密码:111111 正确登录 成功登录 通过
5.2测试后的改进方案
测试是不可穷尽的,测试人员不可能发现系统中所有的缺陷,每个版本发布前也不可能保证所有已知的缺陷都会得到修复,所以反复测试是为了发现更多的缺陷,预防风险[19]。
为了避免人机登录,登录时添加验证码操作,防止企业雇员利用软件打卡,保障员工正常上班。
这次毕业设计是我在我四年的学校生涯中获得的知识的认可,当然其中可能也许不只是在学校学到的东西,也有在互联网上学习到的,通过互联网查询对企业考勤管理系统的资料,了解每个企业对雇员的考勤和办公用品的管理,设计了这个企业考勤管理系统,但是在本次毕业设计具体的过程中还是遇到了很多问题,比如不同的网页打开登录界面,显示的比例不一样,导致背景图片不整齐。这些虽然都是小问题,但是一个一个小问题积累下来就成为了一个大问题,处理不好就会浪费不少时间,所以在设计的过程中需要仔细细心。
通过本次毕业设计我锻炼了自己的自学能力,也从里面学到了平时在课堂上学不到的东西.很多时候我们在课堂听老师的教学,可能当时会觉得知识的获取会非常容易,可是当我独立设计此次项目时,遇到了许多课堂出现的类似技术知识,做起来时也会十分乏力,但是我通过网络文档的查看和百度文库的查询,不仅弥补了我知识的匮乏,还提高了我的项目开发能力。通过这次项目开发我深深的体会到软件开发过程的艰辛,但是当程序运行成功的那一刻,心里更多的是喜悦,觉得前面的付出都是值得的。
本系统可以解决一些企业的考勤问题,但由于时间和知识领悟的限制,系统里面还存是在许多的缺点,里面很多的功能都还可以不断的改进,界面也还可以更加的美观,这些问题以后肯定会一一解决的。总之,我们如果要紧跟时代步伐,需要我们不断地学习创造,只有提高自己本身的能力,再大的困难也难不住我们。