理论和实践的结合-----JavaSE实践项目
实践项目三: 校园兼职平台(合作版)
需求说明
【项目前提】
掌握java基本语法
熟悉使用流程控制
理解面向对象思想
熟练封装,继承,多态
熟悉使用接口,异常
熟悉使用集合
熟悉掌握I/o流相关操作
熟悉数据库操作
了解三层架构和常用设计模式
熟悉使用Git工具
【项目说明】
据了解,目前在校大学生80%以上有做兼职的需求,兼职打工已经不仅仅是经济困难的学生赚取生活费用的途径。调查显示,全球经济危机对就业产生冲击,用人单位对人员的社会实践能力要求提高,大学期间必要的社会实践既可以提高能力,又为适应社会,减轻家庭经济负担起到了积极的作用;社会中虚假兼职机构、欺骗性中介机构充斥,真伪难辨,学生受骗事件频发,极大的损害了学生的经济利益,甚至对学生的人生安全造成威胁。从校园踏入社会,兼职只是一段小小的插曲,通过兼职丰富阅历、增长社会经验固然是好事,可是毫无戒备的步入社会,不仅会事与愿违,还可能造成不必要的损所以。所以,我们需求设计一个校园兼职平台来方便在校学生找兼职。
本平台根据角色定位不同有不同的模块,首先系统有一个登录注册模块,属于兼职人员的模块有个人信息管理和兼职申请;属于管理员的模块有基本信息维护、兼职信息投放和系统管理。
平台登录注册:用户可以通过账号密码登录平台,如果用户是第一次使用该平台,则可以通过注册方式完成信息录入。平台根据用户输入的账号密码,判断该用户的角色是兼职人员还是管理员,展示不同的操作界面。如果用户忘记密码,可以通过自己的账号和注册时录入的真实姓名找回密码。
个人信息管理:能够对用户的基本信息进行管理,包括个人信息的修改,如学生转到别的专业,此时要修改学生的基本信息;修改密码,为了账户的安全性,可以修改用户的密码。查询信用等级,比如有一个用户一开始可以完成兼职等级最高的工作,但是在这次工作中,未能按时完成工作,于是管理员降低了该用户的信用等级,该用户就不能接高级的兼职工作了。查询余额,用户每次按时完成兼职能得到一笔费用,有逾期会扣除一部分佣金,最后得到总的余额。
兼职申请模块:用户能够查询所有的职位信息,因为信用等级的限制,用户也可以只查询自己能够申请的职位信息。查询到合适的职位用户可以直接申请,申请后到达工作截至时间前完成工作可以提前结束工作得到佣金,如果逾期后完成,管理员会调整用户的信用等级。用户可以查询自己已经完成过的兼职信息和自己正在完成的兼职信息。
基本信息维护模块:管理员能够根据用户完成兼职的情况动态的调整用户的兼职等级状态。管理员可以调整兼职的等级,供用户选择。管理员能够根据兼职的等级不同设置逾期费用扣除比例,比如最高级的兼职逾期一天扣10元,扣除兼职费用后继续扣除用户余额,直到用户余额为0,自动结束工作,结算费用。
兼职信息投放:管理员可以把所有公司的兼职招聘信息发布到网上,根据公司的需求设置岗位所需人员,工资以及兼职的时间段,比如发传单,这份兼职需要周一到周五的上午9点至11点工作,那么在这个时间段已经有了其他工作的用户就不能申请该工作。
系统管理模块:管理员能够删除管理员账户,也能删除平台用户以及一些完成过的兼职信息。管理员能够添加平台用户信息到系统,本平台是针对学生的软件,所以能够注册的只能是学生,所以平台需要提前将学生信息录入系统,用户才能注册账号,如果未能及时录入信息照成无法注册,那么就需要联系管理员进行信息录入。管理员可以添加其他的管理员账户,为了安全起见,管理员和普通用户一样能够修改密码。管理员还能够查询所有的用户信息、管理员账户信息、已经投放的职位信息、已经完成的兼职信息和已经逾期的兼职信息。
【项目内容】
项目功能流程结构图(详情请参考对应功能PPT):
项目功能如下:
1.(基本功能来自于项目2,不同之处为数据的存储方式(I/O文件数据库),其它对应功能不用变):
(1)登录注册功能:用户通过注册进入平台,注册信息包括用户编号(用户编号决定角色类型,学号注册为兼职人员,教师编号注册为管理员),注册后到登录界面输入账号和密码登录平台,注册信息包括:用户编号(学号/教师编号)、密码、姓名、出生日期、性别、电话、所在院系、注册日期等。后期如果忘记了密码,用户通过自己的账号和注册时的姓名找回密码。注意,为了安全起见,只有已经录入系统的用户可以注册账户,本平台提前录入了部分管理员和学生的信息到系统中供大家注册。(相关存储数据可通过数据库存储)
(2)个人信息管理:包括个人信息修改、密码修改、查询信用等级和查询余额功能。普通用户登录成功之后,可以修改个人注册时录入的信息,学号和注册时间不可更改,密码单独修改;也可以查询个人的信用等级,若信用等级不是最高,则查询个人信用等级时附加显示“按时完成X次后信用等级恢复至X级”(默认未逾期完成兼职工作3次恢复1级信用等级,等级梯度为1-5级,5级最高)。(相关存储数据可通过数据库存储)
(3)兼职申请功能:包括兼职信息查询、申请工作和结束工作。用户登录成功之后,可以查询所有的兼职信息,包括自己能申请的职位和不能申请的职位,也可以只查看自己能申请的职位(是否可申请与信用等级、岗位所需人员、兼职时间相关)。用户还可查看自己已完成的兼职信息和自己正在完成的兼职信息。满足条件的兼职,用户可以申请,开始工作时间为系统当前时间,相对的该兼职岗位对应的所需人员需要减少;完成工作后(逾期完成信用自动降低1级,0级为最低,0级后不可再申请兼职工作),需要计算所得薪酬(所得薪酬和是否逾期、逾期天数相关),若未逾期且信用等级未满,则需要计算恢复信用等级所需的次数,完成时间手动输入,不可小于兼职开始时间。(相关存储数据可通过数据库存储)
(4)基本信息维护功能:包括兼职等级设置、用户信用调整和逾期费用扣除比例调整。管理员端登录成功之后,可以调整兼职的等级(兼职等级梯度为一-五级,五级最高,一级最低),普通用户的信用等级>=兼职等级可申请职位,还可以增删兼职的类型,比如开发外包/销售/设计师等。管理员可以根据用户的表现动态地调整用户的信用等级,可越级增减,0级信用的普通用户管理员不可调整其信用等级。管理员还可以调整兼职的逾期费用,每天逾期扣除的费用相同,比如:原定一份兼职总薪资1000元,工作要求10天完成,逾期1天扣除100元,调整后一天扣除200元(扣除兼职费用为0后继续扣除用户余额,直到用户余额为<=0,自动结束工作,结算费用)。(相关存储数据可通过数据库存储)
(5)兼职信息投放:包括兼职人员设置、兼职的金额设置、兼职的时间录入以及兼职的其他信息录入。系统管理员登录成功之后可以把所有公司发布的兼职信息录入到平台,录入信息包括:营业执照编号、公司名字、岗位名称、兼职类型、兼职等级、工作内容、需求人数、工作时间等。系统管理员可以根据市场和公司要求,动态调整这些兼职工作的部分内容,比如需求人数、薪水等,工作时间不允许更改。(相关存储数据可通过数据库存储)
(6)系统管理功能:包括对普通用户、管理员和兼职信息的增删查改等。系统提前录入了一些管理员或者学生的信息在系统中,但是未全部录入,所以后续需要注册的用户需要已经录入的管理员登录平台进行信息录入,系统录入仅需要学号/教师编号和姓名即可,此信息供用户注册使用。管理员可以删除普通用户和别的管理员,以及没有用的兼职信息。(相关存储数据可通过数据库存储)
2.(补充功能来自于上面功能图中红色部分,具体细节如下:)
相较于项目二,提供了又一个新的角色,发布兼职人员。他的角色就相当于公司的招聘人员,可以根据公司需求,去这个平台上发布自己公司对应需要的兼职信息。
发布兼职人员基本功能:
可以对兼职信息进行发布
可以对自己发布的兼职信息进行查看(状态:未通过,已通过,未审批),还可以查看审核过关的信息是否有兼职人员已经接取。
可以对自己发布的兼职信息进行撤销
为了保证兼职人员的安全性,所有发布兼职人员发布的信息都需要管理员审批通过后才能展示给兼职人员,如果信息虚假可由管理员直接拒绝。
管理员添加的功能
可以对兼职信息进行审批
可以有审批通过的信息才能展示给兼职人员查看
可以发布兼职人员进行增,删,改,查
大概流程
1.先由管理人员添加发布兼职人员的信息
2.再由发布兼职人员登录后去平台发布兼职信息
3.接着等管理人员审批同意兼职信息后,信息方能在兼职人员界面看到相关信息
4.最后兼职人员登录平台可以去选择自己想要兼职的信息,进行兼职
【项目时长】
7-14天
【项目注意】
注意命名(类名,包名,方法名,注释等),请严格遵循Java命名规则完成项目。
参考文献:https://blog.csdn.net/yang_best/article/details/42169549
需要1:严格按照三层架构的方式去设计模块
需要2:代码设计至少需要使用3常用设计模式
需求3:该项目为团队合作,所以需要使用Git版本控制工具,协同开发
需求4:将项目二的所有存储在文件里的数据,全部放在数据库中,通过JDBC完成CRUD操作,需要个人设计好数据库表
系统实现
首先,此程序采用三层架构来完成,三层架构中的三层分别是表示层、业务逻辑层和数据访问层。
ui/view表示层:负责与用户进行交互,接收用户的请求并将结果返回给用户。通常使用Web界面或者移动应用程序来实现。
service业务逻辑层:负责处理业务逻辑,包括数据处理、计算和验证等。通常使用Java、C#等编程语言来实现。
dao数据访问层:负责与数据库进行交互,包括数据的读取、写入和更新等。通常使用ORM框架或者SQL语句来实现。
比如登录和注册界面代码实现部分:
public static void main(String[] args) throws SQLException, ParseException {
Ui();
}
public static void Ui() throws SQLException, ParseException {
System.out.println("------------欢迎来到校园兼职系统------------");
System.out.println("1.登录");
System.out.println("2.注册");
System.out.println("3.找回密码");
System.out.println("4.退出系统");
System.out.println("请输入选项:");
int i = sc.nextInt();
if (i <= 5 & i >= 1) {
switch (i) {
case 1:
login();//登录
break;
case 2:
register();//学生注册
break;
case 3:
findPassword();//找回密码
break;
case 4:
System.exit(0);
}
} else {
System.out.println("非法输入");
}
}
//登录
public static void login() throws SQLException, ParseException {
SystemServiceImpl j = new SystemServiceImpl();//创建对象 判断是老师还是学生
String num;
String password;
// int state = 1;
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的学号/教师编号");
num = sc.next();
System.out.println("请输入密码");
password = sc.next();
j.login(num, password);
}
public static void findPassword() throws SQLException, ParseException {
//找回密码
System.out.println("1.您是教师");
System.out.println("2.您是学生");
System.out.println("3.返回");
int i = sc.nextInt();
switch (i) {
case 1:
break;
case 2:
stuv.findStuPw();
break;
case 3:
Ui();
}
}
//登录,并调用方法判断账号与密码是否一致
public static void register() throws SQLException, ParseException {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的姓名:");
String name = sc.next();
System.out.println("请输入您的学号/教师编号:");
String num = sc.next();
systemService.register(num, name);
}
public class SystemServiceImpl implements SystemService {
StuService stuService = new StuServiceImpl();
StuView stuv = new StuView();
SystemViewDao systemViewDao = new SystemViewDaoImpl();
SystemView systemView = new SystemView();
StudentDao studentDao = new StudentDaoImpl();
StuAccountDao stuAccountDao = new StuAccountDaoImpl();
Scanner sc = new Scanner(System.in);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
AllPeopleDao allPeopleDao = new AllPeopleDaoImpl();
TeacherDao techD = new TeacherDaoImpl();
public static Teacher loginTeacher= new Teacher();
//注册功能
@Override
public void register(String num, String name) throws SQLException, ParseException {
if (num.length() == 4) {
AllPeople allPeople = allPeopleDao.peopleInfo(num);
if (num.startsWith("s")) {
if (name.equals(allPeople.getName())) {
Student student = new Student();
StuAccount stuAccount = new StuAccount();
stuAccount.setNumber(num);
student.setNumber(num);
student.setName(name);
while (true) {
System.out.println("请输入密码:");
String pw = sc.next();
System.out.println("请重复输入密码:");
String pw2 = sc.next();
if (pw.equals(pw2)) {
student.setPassword(pw);
int i = 0;
int s = 1;
int sex = 0;
int major;
String tel;
while (i == 0) {
System.out.println("请输入生日:");
Date birth = sdf.parse(sc.next());
student.setBirthday(birth);
System.out.println("请选择性别:\\r 1.男 2.女");
student.setSex(s = sc.nextInt());
System.out.println("请选择专业:");
System.out.println("001.计算机");
System.out.println("002.通信");
System.out.println("003.政治");
System.out.println("004.哲学");
student.setMajor(major = sc.nextInt());
System.out.println("请输入联系电话:");
student.setTel(tel = sc.next());
System.out.println("请输入年龄");
int age = sc.nextInt();
student.setAge(age);
if (pw.equals("") || major == 0 || tel.equals("") || age == 0) {
System.out.println("请填写完整内容!!");
} else {
Date createDate = new Date();
student.setCreatedate(createDate);
System.out.println("账号注册成功!");
System.out.println("账号创建时间:" + sdf.format(createDate));
studentDao.addStu(student);
stuAccountDao.addAccount(stuAccount);
stuv.show(student);
break;
}
}
break;
} else {
System.out.println("密码不一致,请重新输入。");
}
}
} else {
System.out.println("编号和姓名不匹配。");
}
} else {
System.out.println("非法编号");
}
} else {
System.out.println("非法编号");
}
}
//根据账号的首字母判断身份 并进入不同的界面
@Override
public void login(String num, String password) throws SQLException, ParseException {
if (num.length() == 4) {
if (num.startsWith("t")) {
Teacher teacher = techD.getTechInfo(num);
if (password.equals(teacher.getPassword()) && teacher.getState() == 0) {
PosterView.show();
} else if (password.equals(teacher.getPassword()) && teacher.getState() == 1) {
loginTeacher=teacher;
AdminView_.show(teacher);
} else {
System.out.println("输入的人员编号或密码有误");
}
} else if (num.startsWith("s")) {
Student student = studentDao.getStuInfo(num);
if (password.equals(student.getPassword())) {
System.out.println("登陆成功!");
StuView.show(student);
} else {
System.out.println("输入的人员编号或密码有误");
}
} else {
System.out.println("非法编号");
}
} else {
System.out.println("非法编号");
}
}
}
–主界面–
根据登录编号的首位字符判断是否是学生、兼职发布人员还是管理员,并进入三个不同的界面
管理员界面
学生用户界面